bzoj5130: [Lydsy1712月赛]字符串的周期
这道题很有意思啊。
字符串循环节用KMP(手推一下)
假如是26^12肯定很不滋磁
但是可以发现ABA和BCB和BAB这些都是等价的
那就把最小的拿出来搞再乘个排列数就好了
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const LL mod=998244353; int n,m,a[20],p[20];LL mi[20],ans; LL KMP() { p[1]=0;int j=0; for(int i=2;i<=n;i++) { while(j>0&&a[j+1]!=a[i])j=p[j]; if(a[j+1]==a[i])j++; p[i]=j; } LL ret=1; for(int i=1;i<=n;i++) ret=(ret*(i-p[i]))%mod; return ret; } void dfs(int k,int maxp) { if(k==n+1) { ans=(ans+mi[maxp]*KMP())%mod; return ; } for(int i=1;i<=maxp;i++) { a[k]=i; dfs(k+1,maxp); a[k]=0; } a[k]=++maxp;dfs(k+1,maxp); } int main() { scanf("%d%d",&n,&m); mi[0]=1;for(int i=1;i<=n;i++)mi[i]=(mi[i-1]*(m-i+1))%mod; ans=0;dfs(1,0); printf("%lld\n",ans); return 0; }
pain and happy in the cruel world.