Problem 1752 A^B mod C
Accept: 714 Submit: 3084
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem 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 42 10 1000
Sample Output
124
Source
FZU 2009 Summer Training IV--Number Theory
题意很简单,求A^BmodC
但是数据范围很大,如果直接快速幂会爆 unsigned long long.
所以在计算快速幂的时候通过二进制计算A*B;
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <sstream>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <ctime>
using namespace std;
typedef unsigned long long LL;
LL mul(LL a,LL b,LL c){
LL ans = 0,temp = a%c;
while(b){
// cout<<"ans"<<endl;
if(b&0x1){
if((ans+=temp)>=c){
ans-=c;
}
}
if((temp<<=1)>=c){
temp-=c;
}
b>>=1;
}
return ans;
}
LL modPow(LL a,LL b,LL m){
LL ret = 1;
while(b){
// cout<<"ret"<<endl;
if(b&1){
ret = mul(ret,a,m);
}//ret = ret*a%m;
//a = a*a%m;
a = mul(a,a,m);
b>>=1;
}
return ret;
}
int main() {
LL a,b,c;
while(scanf("%I64d%I64d%I64d",&a,&b,&c)!=EOF){
LL sum = modPow(a,b,c);
printf("%I64d\n",sum);
}
return 0;
}