【数论】Codeforces Round #334 (Div. 2) D

来源:互联网 发布:网络万能 编辑:程序博客网 时间:2024/04/29 10:24

什么也不说了。。

纯纯的数学题。。

首先考虑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;}

0 0