题目 : http://acm.fzu.edu.cn/problem.php?pid=1759
题目大意 : 求 A^b % c的值,其中a,c<1000000000 b<10^1000000
考察点 : A^B % C = A ^(B % PHI(C) + PHI(C) ) % C ( B >= PHI(C));
思路 : 执行上面公式的过程
提交情况: Accepted 1 次
收获/经验 : 要找到严谨的公式
AC code:
#include <stdio.h>
#include <math.h>
#define MAXB 10000010
#define I64 __int64
charb[MAXB];
I64 prime[1110];
I64 Getphi(I64 c){
I64 ans = c, i, count = 0, m;
if(c % 2 == 0){
prime[count ++] = 2;
while(c % 2 == 0) c /= 2;
}
m = (I64)sqrt((long double)c) + 1;
for(i = 3; i <= m && c >= i; i += 2)
if(c % i == 0){
prime[count ++] = i;
while(c % i == 0) c /= i;
}
if(c != 1) prime[count ++] = c;
for(i = 0; i < count; i ++)
ans = (ans / prime[i]) * (prime[i] - 1);
return ans;
}
I64 Multi(I64 a, I64 x, I64 c){
I64 temp = 0;
while(x){
if(x & 1) temp = (temp + a) % c;
a = (a + a) % c;
x >>= 1;
}
return temp;
}
I64 Get_mod(I64 a, I64 x, I64 c){
I64 temp = 1;
a %= c;
while(x){
if(x & 1) temp = Multi(temp, a, c);
a = Multi(a, a, c);
x >>= 1;
}
return temp;
}
int main(){
I64 a, c, PHI, t, ans, i;
while(~scanf("%I64d %s %I64d", &a, b, &c)){
PHI = Getphi(c);
t = 0;
for(i = 0; b[i] != '\0'; i ++){
t = t * 10 + b[i] - 48;
if(t > PHI) break;
}
if(t > PHI){
t = 0;
for(i = 0; b[i] != '\0'; i ++)
t = ((t * 10) + (b[i] - 48)) % PHI;
t += PHI;
}
ans = Get_mod(a, t, c); //求a^t % c 用快速幂
printf("%I64d\n", ans);
}
return 0;
}