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