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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43813140/article/details/99678915

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

猜你喜欢

转载自blog.csdn.net/qq_43813140/article/details/99678915