版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
Super A^B mod C
Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^1000000).
Input
There are multiply testcases. Each testcase, there is one line contains three integers A, B and C, separated by a single space.
Output
For each testcase, output an integer, denotes the result of A^B mod C.
Sample Input
3 2 4 2 10 1000
Sample Output
1 24
这题,要了解的是降幂公式,这很重要
题意:A^B mod C
题解:
降幂公式 phi() 为欧拉函数
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string.h>
#include<iterator>
#include<vector>
#include<stdlib.h>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<sstream>
#define lowbit(x) (x&(-x))
typedef long long ll;
using namespace std;
ll x,z;
char a[1000006];
ll quickpow(ll x,ll y,ll z)//快速幂
{
ll ans = 1;
while(y)
{
if(y&1)
ans=ans*x%z;
x=x*x%z;
y>>=1;
}
return ans;
}
ll phi(ll n)//欧拉函数
{
ll i,rea = n;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
rea = rea - rea/i;
while(n%i==0)
n/=i;
}
}
if(n>1)
rea = rea - rea/n;
return rea;
}
int main()
{
while(scanf("%lld %s %lld",&x,a,&z)!=EOF)
{
ll len = strlen(a);
ll p = phi(z);
ll ans = 0;
for(ll i=0;i<len;i++)
ans = (ans*10+a[i]-'0')%p;
ans+=p;
printf("%lld\n",quickpow(x,ans,z));
}
return 0;
}