首先k=0时,答案就是 pp−1
k=1时,答案就是 pp
k>=2时答案就是 pp−1m ,其中m为k mod p意义下的order。
根据费马小定理,我们有 kp−1≡1mod p ,所以m一定是p-1的因数,也可以 O(p√) 的枚举p-1的因数来算。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 1000010
#define mod 1000000007
inline char gc(){
static char buf[1<<16],*S,*T;
if(S==T){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}
return *S++;
}
inline int read(){
int x=0,f=1;char ch=gc();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();
return x*f;
}
int p,k;
inline int ksm(int x,int k){
int res=1;
for(;k;k>>=1,x=(ll)x*x%mod)
if(k&1) res=(ll)res*x%mod;return res;
}
int main(){
// freopen("a.in","r",stdin);
p=read();k=read();
if(!k){printf("%d\n",ksm(p,p-1));return 0;}
if(k==1){printf("%d\n",ksm(p,p));return 0;}
int m=1,x=k;
while(x!=1){
++m,x=(ll)x*k%p;
}printf("%d\n",ksm(p,(p-1)/m));return 0;
}