51nod 1046 A^B Mod C

                                        #include<iostream>
                                        using namespace std;
                                        int main()
                                       {long long a,b,c,sum= 1;
                                        cin>>a>>b>>c;
                                         a=a%c;              
                                       while(b)
                                       {  if(b%2==1)
                                       sum=(sum*a)%c;
                                        b/=2;
                                      a=(a*a)%c;
                                           }
                                         cout<<sum;
   简单的算法是将sum初始化为1,然后重复将sum乘以X,每次乘法之后应用%运算符(这样使得sum的值变小,以免溢出),执行N次相乘后,sum就是我们要找的答案。

这样对于较小的N值来说,实现是合理的,但是当N的值很大时,需要计算很长时间,是不切实际的。下面的结论可以得到一种更好的算法。
如果N是偶数,那么X^N =(X*X)^[N/2];
如果N是奇数,那么X^N = X*X^(N-1) = X *(X*X)^[N/2];
其中[N]是指小于或等于N的最大整数。

posted @ 2018-01-31 11:10  kong孔  Views(92)  Comments(0)    收藏  举报