什么也不说了。。
纯纯的数学题。。
首先考虑k=0和k=1两种情况,
k=0的时候f(0)=0
然后其他的都随意了(题目不要求一定是满射)
k=1的时候f(x)=f(x) 连x=0都随意了。
然后考虑k>=2
f(kx1 mod p)=k(f(x1)) mod p
让我们来假设kx1=x2
那么
f(x2)=kf(x1) mod p
f(x3)=kf(x2) mod p
f(x4)=kf(x3) mod p
f(x4)=k^3f(x1) mod p
当k^n mod p=1的时候
就又回去了
所以一个环有n个数,
然后关键的一点是
每个环都有n个数!
一开始每个环的数有p种选法
假设一开始有x个数
那么总共的方案数就是p^((p-1)/n);
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
long long ans=0,p,k;
scanf("%I64d%I64d",&p,&k);
if (k==0)
{
ans=1;
for (int i=1;i<p;i++)
ans=(ans*p)%1000000007;
printf("%I64d",ans);
return 0;
}
if (k==1)
{
ans=1;
for (int i=1;i<=p;i++)
ans=(ans*p)%1000000007;
printf("%I64d",ans);
return 0;
}
long long tmp=1;
for (int i=1;i<=p;i++)
{
tmp=(tmp*k)%p;
if (tmp==1)
{
ans=1;
for (int j=(p-1)/i;j;j--)
ans=(ans*p)%1000000007;
printf("%I64d",ans);
return 0;
}
}
return 0;
}