欧拉函数 FZOJ 1759 Super A^B mod C

来源:互联网 发布:c语言基础课程视频 编辑:程序博客网 时间:2024/05/17 22:30

Problem 1759 Super A^B mod C

Accept: 560    Submit: 1877
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 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 42 10 1000

 Sample Output

124

 Source

FZU 2009 Summer Training IV--Number Theory


题意:就是求A^B%C

思路:由于B可能有100W位,所以直接快速幂肯定是超时的。所以需要降幂,有降幂公式:(a^(b%phi(c)+phi(c))%c=a^b%c


代码:

#include <vector>#include <list>#include <map>#include <set>#include <queue>#include <string.h>#include <string>#include <deque>#include <stack>#include <bitset>#include <algorithm>#include <functional>#include <numeric>#include <utility>#include <sstream>#include <iostream>#include <iomanip>#include <cstdio>#include <cmath>#include <cstdlib>#include <ctime>using namespace std;#define mp make_pair#define rep(i,n) for(int i=0;i<n;++i)#define clr(a,x) memset(a,x,sizeof(a))#define LL long longLL phi(LL n){    LL ans=n;    for(LL i=2;i*i<=n;++i) {        if(n%i==0) {            ans=ans/i*(i-1);            while(n%i==0) n/=i;        }    }    if(n>1) ans=ans/n*(n-1);    return ans;}char B[1000000+5];LL qpow(LL base,LL p,LL mod){    LL ret=1;    while(p>0) {        if(p&1) ret=(ret*base)%mod;        base=(base*base)%mod;        p>>=1;    }    return ret;}int main(){    LL A,C;    while(scanf("%I64d",&A)==1) {        scanf("%s",B); scanf("%I64d",&C);        LL y=phi(C);        LL c=0;        int len=strlen(B);        for(int i=0;i<len;++i) {            c=c*10+B[i]-'0';            c%=y;        }        printf("%I64d\n",qpow(A,c,C));    }}


0 0
原创粉丝点击