ybtoj 43.B 周期字符串
【题意】
【分析】
设$f_i$表示循环节长度为i的字符串的个数
设$g_i$表示循环节长度为i的因数的字符串个数
容易求出$g_i=26^i$,因为所有长度为i的字符串的循环节长度一定都是i的因数
然后我们利用莫比乌斯反演可以求出$f_n=\sum_{d|n}g(d)\mu(n/d)$
【代码】
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e8+5; const int mod=1e9+7; int n; int mu(int x) { int res=1; for(int i=2;1LL*i*i<=x;i++) { if(x%i!=0) continue; int cnt=0; while(x%i==0) x/=i,cnt++; if(cnt>=2) return 0; res*=-1; } if(x>1) res*=-1; return res; } int qpow(int a,int b) { int res=1; while(b) { if(b&1) res=1LL*res*a%mod; a=1LL*a*a%mod; b>>=1; } return res; } int main() { // freopen("a.in","r",stdin); // freopen("a.out","w",stdout); scanf("%d",&n); int lim=sqrt(n); int ans=0; for(int i=1;i<=lim;i++) { if(n%i!=0) continue; ans=(ans+1LL*qpow(26,i)*mu(n/i)%mod+mod)%mod; if(i*i!=n) ans=(ans+1LL*qpow(26,n/i)*mu(i)%mod+mod)%mod; } printf("%d",(ans+mod)%mod); return 0; }