社区讨论
WA26个求条
AT_abc388_f [ABC388F] Dangerous Sugoroku参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m5uukvif
- 此快照首次捕获于
- 2025/01/13 17:34 去年
- 此快照最后确认于
- 2025/01/13 21:37 去年
思路,裸的矩乘把 2 的幂次预处理出来,时间复杂度 。
CPP#include<bits/stdc++.h>
#define int long long
#define Mx 25
using namespace std;
struct mat {
int a[Mx][Mx];
mat() {memset(a,0,sizeof a);}
mat operator*(const mat&x)
const {
mat res;
for(int i=1;i<Mx;i++)
for(int j=1;j<Mx;j++) {
int cnt = 0;
for(int k=1;k<Mx;k++)
cnt |= res.a[i][k]|x.a[k][j];
res.a[i][j] = cnt;
}
return res;
}
} fac[45],fac0[45],S;
struct line {
int a[Mx];
line() {memset(a,0,sizeof a);}
line operator*(const mat&x)
const {
line res;
for(int j=1;j<Mx;j++) {
int cnt = 0;
for(int k=1;k<Mx;k++)
cnt |= res.a[k]|x.a[k][j];
res.a[j] = cnt;
} return res;
}
} ;
mat fsp(int x) {
mat res;
for(int i=0;i<=20;i++)res.a[i][i]=1;
for(int i=0;i<45;i++)
if((x>>i)&1)res = res*fac[i];
return res;
}
mat fsp0(int x) {
mat res;
for(int i=0;i<=20;i++)res.a[i][i]=1;
for(int i=0;i<45;i++)
if((x>>i)&1)res = res*fac0[i];
return res;
}
signed main()
{
int n,m,a,b;
cin>>n>>m>>a>>b;
for(int i=1;i<=19;i++)
fac[0].a[i+1][i] = fac0[0].a[i+1][i] = 1;
for(int i=20-b+1;i<=20-a+1;i++)
fac[0].a[i][20] = 1;
S.a[1][20] = 1;
for(int i=1;i<45;i++)
fac[i] = fac[i-1]*fac[i-1],
fac0[i] = fac0[i-1]*fac0[i-1];
int lst = 1;
for(int i=1;i<=m;i++) {
int l,r; cin>>l>>r;
if(r-l+1 >= 21||l == 1)
return cout<<"No",0;
if(l-lst-1 > 0)S = S*fsp(l-lst-1);
if(r-l+1 > 0)S = S*fsp0(r-l+1);
lst = r;
}
if(n-lst > 0)S = S*fsp(n-lst);
if(S.a[1][20])cout<<"Yes";
else cout<<"No";
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...