题目链接:Super A^B mod C
本题不能通过常规的快速幂来作答。
当 A^B%Mod 当B 很大时,要通过降幂来处理。
引入一个定理:
A^x % m = A^(x%phi(m)+phi(m)) % m (x >= phi(m))
了解上述定理之后问题便可转化解出。
本题卡 lld .....
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int N = 1000005;
typedef long long ll;
char str[N];
int phi(int n){
int res = n;
for(int i=2;i*i<=n;i++){
if(n % i == 0){
res = res - res / i;
while(n % i == 0) n/=i;
}
}
if(n > 1) res = res - res / n;
return res;
}
ll multi(ll a,ll b,ll m){
ll ans = 0;
a %= m;
while(b){
if(b&1){
ans = (ans + a ) % m;
b --;
}
b >>= 1;
a = (a + a) % m;
}
return ans;
}
ll quickMod(ll a,ll b,ll m){
ll ans = 1;
a %= m;
while(b){
if(b&1){
ans = multi(ans,a,m);
b --;
}
b >>= 1;
a = multi(a,a,m);
}
return ans;
}
void solve(ll a,char str[],ll c){
ll len = strlen(str);
ll ans = 0;
ll p =phi(c);
if(len <= 15){
for(int i=0;i<len;i++){
ans = ans * 10 + str[i] - '0';
}
}
else {
for(int i=0;i<len;i++){
ans = ans * 10 + str[i] - '0';
ans %= p;
}
ans += p;
}
printf("%I64d\n",quickMod(a,ans,c));
}
int main(){
ll a,c;
while(scanf("%I64d%s%I64d",&a,str,&c) != EOF)
solve(a,str,c);
return 0;
}