题目大意:A^B mod C。。B很大!!!~
解题思路:
欧拉定理的完美应用:
ab≡⎧⎩⎨⎪⎪ab%ϕ(p) gcd(a,p)=1ab gcd(a,p)≠1,b<ϕ(p)ab%ϕ(p)+ϕ(p) gcd(a,p)≠1,b≥ϕ(p) (mod p)
证明转载自http://blog.csdn.net/synapse7/article/details/19610361
AC代码:
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
#include <cmath>
#include <set>
using namespace std;
typedef long long ll;
ll a, c;
char b[1010000];
ll res;
ll euler(ll x) {
int ans = x;
for (int i = 2; i <= sqrt(x)+1; i++){
if(!(x%i)) {
ans -= ans/i;
while(!(x%i)) {
x /= i;
}
}
}
return x>1 ? ans - ans/x : ans;
}
ll quick_mod(ll a, ll n, ll mod) {
ll ans = 1;
while(n) {
if(n&1) {
ans = ans*a%mod;
}
a = a*a%mod;
n >>= 1;
}
return ans;
}
void JM(char *bb, ll cc) {
res = 0;
int len = strlen(bb);
if(len < 18) {
for (int i = 0; i < len; i++) {
res = res*10 + bb[i] - '0';
}
}
else {
int mod = euler(cc);
for (int i = 0; i < len; i++) {
res = res *10 + bb[i] - '0';
res %= mod;
}
res += mod;
}
}
int main() {
while(~scanf("%lld%s%lld",&a,&b,&c)){
JM(b, c);
printf("%lld\n", quick_mod(a, res, c));
}
}