QBXT 【可爱数字】
前方辣眼题解QAQ
利用一个玄学性质,幸运数s是k进制下的不具有循环节的最小的那个数(我这里表述不太准确,是那种数字排列相同,类似于环状的一组数中最小的的那一个),设一个f[i]数组表示k进制下i位数(由于可以有前导零嘛)的总选择(语言能力表达有限QAQ)数目
所以
看着代码推倒推导一遍大致就能理解了,至于那个玄学性质。。。无力证明
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
long long const P=1000000007,M=100000;
int m;
long long n,k,g[M],f[M];
long long comp(long long b,long long c,long long m) //一个快速幂
{
long long ans=1;
long long l=b;
long long j=1;
while (j<=c)
{
if ((j & c)>0) ans=(ans*l) % m;
l=(l*l) % m;
c=c>>1;
}
return ans;
}
int main()
{
// freopen("cute9.in","r",stdin);
// freopen("cute9.out","w",stdout);
cin>>n>>k;
for (long long i=1;i*i<=n;i++)
if (n % i==0)
{
g[++m]=i;//n的因子
if (i*i<n) g[++m]=n/i;
}
sort(g+1,g+m+1);
f[1]=k;
for (int i=2;i<=m;i++)
{
f[i]=comp(k,g[i],P);
cout<<f[i]<<endl;
for (int j=1;j<=i-1;j++)
if (g[i] % g[j]==0) f[i]=(f[i]+P-f[j]) % P;
}
printf("%lld\n",f[m]*comp(n,P-2,P) % P);
}
因为n的因子的循环串可以构成n位的循环串,就像8位中1,2,4都可反复循环得到8位,不符合玄学性质中要求没有循环这一条件。又因为每个因子中的可以构成这个因子的因子一定也是n的因子,所以就要将n的因子筛出来。