题解:P5134 好编号
题目传送门。
思路
首先题目要求
问题相当于求有多少个长度为
- 合法的串不存在整周期。
- 不存在整周期的串一定存在一个循环位移串满足条件。
于是计数,令
最后得到的
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int Mod=1e9+7;
int n,k;
vector<int>divs;
map<int,int>f;
inline ll ksm(ll a,int b,int mod){
ll z=1;
while(b){
if(b&1) z=z*a%mod;
a=a*a%mod;
b>>=1;
}
return z;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i*i<=n;i++){
if(!(n%i)){
divs.emplace_back(i);
if(i*i!=n) divs.emplace_back(n/i);
}
}
sort(divs.begin(),divs.end());
for(auto i:divs){
f[i]=ksm(k,i,Mod);
for(auto j:divs)
if(!(i%j) and i!=j)
f[i]=(f[i]-f[j]+Mod)%Mod;
}
printf("%lld",f[n]*ksm(n,Mod-2,Mod)%Mod);
system("pause");
return 0;
}