[PKUSC2018]神仙的游戏

神仙的游戏
设 s 的长度为 len,那么当 k<=\(\lfloor\frac{len}{2}\rfloor\) 时,只需要 s[1..k]=s[len-k+1...len] 即可。
也就是说我们要判断前缀的1与后缀的0是否对应。
我们设 \(a[i]=[s[i]=='1'] , b[i]=[s[len-i+1]=='0']\)
比如假设 s 为10......10
那么此时
a=[1,0],b=[1,0]
所以 a 中的1对应0,a 中的0对应1。
发现若是每一位都满足这样的对应关系,那么 a与 b 的卷积的第 k 位是0。
所以用 NTT 即可判断。
若是 k>\(\lfloor\frac{len}{2}\rfloor\),那么仅仅判断前后缀是否对应是不够的。
举个例子,假设 s 为101?010,k为4。
那么1会对应到?,而?会对应到0。
此时前缀的移位为 len-k,等价于每一位在模 len-k 的分类下不能既有1又有0。
也就是若1和0的位置为 i,j,那么当 (len-k)|(i-j) 时 k 不合法。
发现根据上面构造 a,b 的方式就可以直接表示出是否存在这样的一个(i-j)。
因为 k<=\(\lfloor\frac{len}{2}\rfloor\) 也满足上面的性质,所以调和级数枚举一下即可。
code:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
const int MAXN=2e6+5;
const int Mod=998244353;
const int g=3;
const int gg=332748118;
#define ll long long
int r[MAXN],up,n,l;
bool vis[MAXN];
char cao[MAXN];
ll a[MAXN],b[MAXN],Ans;
ll ksm(ll a,int b){ll res=1;while(b){if(b&1) res=res*a%Mod;a=a*a%Mod;b>>=1;}return (res+Mod)%Mod;}
void ntt(ll *A,int op){
	for(int i=0;i<up;i++) if(i<r[i]) swap(A[i],A[r[i]]);
	for(int mid=1;mid<up;mid<<=1){
		ll mi=ksm(op==1?g:gg,(Mod-1)/(mid<<1));
		for(int rr=mid<<1,j=0;j<up;j+=rr){
			ll w=1;
			for(int kk=0;kk<mid;kk++,w=w*mi%Mod){
				ll x=A[j+kk],y=((w*A[j+mid+kk]%Mod)+Mod)%Mod;
				A[j+kk]=(((x+y)%Mod)+Mod)%Mod;A[j+mid+kk]=(((x-y)%Mod)+Mod)%Mod;
			}
		}
	}
	if(op==-1){
		ll of=ksm(up,Mod-2);
		for(int i=0;i<up;i++) A[i]=((A[i]*of%Mod)+Mod)%Mod;
	}
}
int main(){
	scanf("%s",&cao);n=strlen(cao);
	for(int i=0;i<n;i++){
		if(cao[i]=='1') a[i]=1;
		if(cao[n-i-1]=='0') b[i]=1;
	}
	up=1;while(up<=(n<<1)) up<<=1,l++;
	for(int i=0;i<up;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
	ntt(a,1);ntt(b,1);
	for(int i=0;i<up;i++) a[i]=a[i]*b[i]%Mod;
	ntt(a,-1);
	for(int i=1;i<(n<<1);i++) vis[abs(n-i-1)]+=a[i];
	Ans=1LL*n*n;
	if(!(cao[0]=='1'&&cao[n-1]=='0')&&!(cao[0]=='0'&&cao[n-1]=='1')) Ans^=1;
	for(int i=1;i<n-1;i++){
		bool pd=0;
		for(int j=i;j<=n;j+=i){
			if(vis[j]){pd=1;break;}
		}
		if(!pd) Ans^=1LL*(n-i)*(n-i);
	}
	printf("%lld",Ans);return 0;
}
/*
1?000111?
*/
posted @ 2023-02-19 15:00  StranGePants  阅读(15)  评论(0编辑  收藏  举报