九度[1085]求root(N,K)

 1 # include<iostream>
 2 using namespace std;
 3 int main(){
 4     long long int x=0,y=0,k=0;
 5     while(cin>>x>>y>>k)
 6     {
 7         long long int sum=1;
 8         k--;
 9         while(y)
10         {
11             if(y%2!=0) sum=(sum*x)%k;
12             x=(x*x)%k;
13             y=y/2;
14         }
15         if(sum==0) cout<<k<<endl;
16         else cout<<sum<<endl;
17     }
18     return 0;
19 }

参考论坛代码,以及相关博客自己总结如下:

如果N>=K  则N=a0+a1*k+a2*k2+……+an*kn;

N(r)=a0+a1+a2+a3+……+an;

N-N(r)=a1*(k-1)+a2*(k2-1)+……+an(kn-1)

(N-N(r))%(k-1)=0;

N(r)=N%(k-1);

故如果N(r)==0 N=k-1;

否则,N(r)就是我们要求的结果;

至于求N,则用到了快速幂取模:(a*b)mod n = ((a mod n) * b ) mod n;

你可能感兴趣的:(九度[1085]求root(N,K))