社区讨论

WA26个求条

AT_abc388_f [ABC388F] Dangerous Sugoroku参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m5uukvif
此快照首次捕获于
2025/01/13 17:34
去年
此快照最后确认于
2025/01/13 21:37
去年
查看原帖
思路,裸的矩乘把 2 的幂次预处理出来,时间复杂度 O(m202logn)O(m20^2\log n)
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 条回复,欢迎继续交流。

正在加载回复...