数据范围:
1<=a,b,p<=1e18
#include<stdio.h>
#include<string.h>
long long F(long long m,long long n,long long N);
int main()
{
long long a,b,p,n,sum;
while(scanf("%lld%lld%lld",&a,&b,&p)!=EOF)
{
sum=1;
while(b)
{
if(b%2==1)
sum=F(sum,a,p);
a=F(a,a,p);
b/=2;
}
printf("%lld\n",sum);
}
return 0;
}
long long F(long long m,long long n,long long N)
{
long long a[110],b[110],c[110],d[110];
long long sum,t,i=0,j=0,k,p,q;
while(m)
{
a[i++]=m%10;
m/=10;
}
while(n)
{
b[j++]=n%10;
n/=10;
}
memset(c,0,sizeof(c));
for(p=0;p<i;p++)
for(q=0;q<j;q++)
c[p+q]+=a[p]*b[q];
t=0;
for(k=0;k<i+j-1;k++)
{
d[k]=(c[k]+t)%10;
t=(c[k]+t)/10;
}
while(t)
{
d[k++]=t%10;
t/=10;
}
sum=0;
for(i=k-1;i>=0;i--)
sum=(10*sum+d[i])%N;
return sum;
}