题目链接:https://oj.neu.edu.cn/contest/70/problem/3
分析:
这题略坑。。O(nlogn)过不了,实际上t(1)=(p-1)/gcd(k,p-1),O(logp)可以得到t(1)。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<vector> 5 using namespace std; 6 vector<int> vec; 7 const int maxn=1e5+5,MOD=1e9+7; 8 typedef unsigned long long ll; 9 int k,p,n; 10 bool have[maxn]; 11 int pri[maxn],len=0; 12 void CalPri(){ 13 int maxn=100; 14 bool Is_pri[maxn]; 15 memset(Is_pri,-1,sizeof(Is_pri)); 16 for(int i=2;i<maxn;i++){ 17 if(Is_pri[i]) 18 pri[len++]=i; 19 for(int j=0;j<len&&pri[j]*i<maxn;j++){ 20 Is_pri[i*pri[j]]=false; 21 if(i%pri[j]==0) 22 break; 23 } 24 } 25 } 26 ll qpow(int a,int n,int mod){ 27 ll res=1,y=a,k=1; 28 while(k<=n){ 29 if(k&n){ 30 res=(res*y)%mod; 31 } 32 y=(y*y)%mod; 33 k<<=1; 34 } 35 return res; 36 } 37 int gcd(int a,int b){ 38 if(a==0)return b; 39 else return gcd(b%a,a); 40 } 41 int main(){ 42 //freopen("e:\in.txt","r",stdin); 43 while(scanf("%d%d%d",&k,&p,&n)!=EOF){ 44 if(k==0){ 45 printf("1 "); 46 continue; 47 } 48 int GCD=gcd(k,p-1); 49 ll ans; 50 memset(have,0,sizeof(have)); 51 int c=0; 52 while(k%p==0){ 53 c++; 54 k/=p; 55 } 56 ans=qpow(p,max(n-c-1,0),MOD); 57 int count=(p-1)/GCD; 58 ans=(ans*count)%MOD; 59 printf("%lld ",ans); 60 } 61 return 0; 62 }
官方题解: