Description
Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,B,C<2^63).
Input
There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.
Output
For each testcase, output an integer, denotes the result of A^B mod C.
Sample Input
3 2 4 2 10 1000
Sample Output
1 24
由于a,b,c都比较大 简单的快速幂取模算法中 的乘法得到的结果 比较大可能超 long long 的范围
因此需要将乘法转换为二进制的加法
#include <iostream> #include <cstdio> using namespace std; typedef unsigned long long LL; //模拟乘法,把乘法变成二进制加法。 LL mul(LL a,LL b,LL m)//二分 求 a*b%m; { LL res=0,tmp=a%m; while(b) { if(b&1) if((res+=tmp)>=m) res-=m; if((tmp<<=1)>=m) tmp-=m; b>>=1; } return res; } LL quick_mod(LL a,LL b,LL m)//二分求a^b%m { LL ans = 1; a%=m; while(b) { if(b%2==1) { ans=mul(ans,a,m); b--; } b/=2; a=mul(a,a,m); } return ans; } int main() { LL a,b,m; while(cin>>a>>b>>m){ cout<<quick_mod(a,b,m)<<endl; } return 0; }