FZU 1759-Super A^B mod C (快速幂+欧拉降幂+欧拉函数)

来源:互联网 发布:2017php面试题大全 编辑:程序博客网 时间:2024/05/18 01:30

Problem Description
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

思路:先求出c的欧拉函数然后进行欧拉降幂,然后用快速幂求解即可
注意开longlong

代码如下

#include <iostream> #include <cstring>using namespace std; #define LL long long LL a,c;char s[1000005];LL kpow(LL x,LL n)   // x^n%MAX{      LL res=1;      while(n>0)      {          if(n & 1)              res=(res*x)%c;          x=(x*x)%c;          n >>= 1;      }      return res;  }  //直接求解欧拉函数  LL euler(LL n){ //返回euler(n)          LL res=n,a=n;         for(LL i=2;i*i<=a;i++){             if(a%i==0){                 res=res/i*(i-1);//先进行除法是为了防止中间数据的溢出                  while(a%i==0) a/=i;             }         }        if(a>1) res=res/a*(a-1);        return res;  }int main(){    while(~scanf("%d%s%d",&a,s,&c))    {        int len=strlen(s);        LL mod=euler(c);        LL ans=0;        for(int i=0;i<len;i++)        ans=(ans*10+s[i]-'0')%mod;        ans+=mod;        printf("%lld\n",kpow(a,ans));     }    return 0; } 
阅读全文
0 0