您的位置:首页 > 其它

FZU 1752 A^B mod C (快速幂)

2014-08-13 20:41 357 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息