Problem 1759 Super A^B mod C
Accept: 560 Submit: 1877
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,C<=1000000000,1<=B<=10^1000000).
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^B%C
思路:由于B可能有100W位,所以直接快速幂肯定是超时的。所以需要降幂,有降幂公式:(a^(b%phi(c)+phi(c))%c=a^b%c
代码:
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <string.h>
#include <string>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
#define mp make_pair
#define rep(i,n) for(int i=0;i<n;++i)
#define clr(a,x) memset(a,x,sizeof(a))
#define LL long long
LL phi(LL n)
{
LL ans=n;
for(LL i=2;i*i<=n;++i) {
if(n%i==0) {
ans=ans/i*(i-1);
while(n%i==0) n/=i;
}
}
if(n>1) ans=ans/n*(n-1);
return ans;
}
char B[1000000+5];
LL qpow(LL base,LL p,LL mod)
{
LL ret=1;
while(p>0) {
if(p&1) ret=(ret*base)%mod;
base=(base*base)%mod;
p>>=1;
}
return ret;
}
int main()
{
LL A,C;
while(scanf("%I64d",&A)==1) {
scanf("%s",B); scanf("%I64d",&C);
LL y=phi(C);
LL c=0;
int len=strlen(B);
for(int i=0;i<len;++i) {
c=c*10+B[i]-'0';
c%=y;
}
printf("%I64d\n",qpow(A,c,C));
}
}