原题:http://codeforces.com/contest/17/problem/D
题意:求[(b-1)*b^(n-1)]%c, 如果ans = 0, 则ans = c;
思路:指数循环节 ——
(其中Φ为欧拉函数);
#include<bits/stdc++.h>
#define ll __int64
using namespace std;
const int maxn = 1e6+5;
char B[maxn], N[maxn];
ll c;
ll Euler(ll n)
{
ll ret = n;
for(ll i = 2;i<=(ll)sqrt(n);i++)
{
if(n%i == 0)
{
ret = ret/i*(i-1);
while(n%i == 0)
n /= i;
}
}
if(n>1)
ret = ret/n*(n-1);
return ret;
}
ll Quick_pow(ll x, ll y, ll k)
{
ll ret = 1;
while(y > 0)
{
if(y & 1) ret = (ret*x)%k;
y = y >> 1 ;
x = (x*x)%k;
}
return ret;
}
int main(){
scanf("%s%s%I64d", B, N, &c);
int lenb = strlen(B);
ll b = 0;
for(int i = 0;i<lenb;i++){
int x = B[i]-'0';
b = (b*10+x)%c;
}
if(b == 0) b = c;
ll tmp = Euler(c);
int lenn = strlen(N);
ll n = 0;
bool flag = false;
for(int i = 0;i<lenn;i++){
int x = N[i]-'0';
n = n*10+x;
if(n >= tmp) flag = true;
n %= tmp;
}
ll m = n%tmp+tmp;
ll pp;
if(flag) pp = Quick_pow(b, m-1, c);
else pp = Quick_pow(b, n-1, c);
ll ans = ((b-1)*pp)%c;
if(ans == 0) ans = c;
cout<<ans<<endl;
return 0;
}