a^b mod p

183 阅读1分钟

数据范围:

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;
}