cf 17D Notepad 欧拉降幂

题目链接:http://codeforces.com/problemset/problem/17/D

求(b-1)bn-1%c,对bn-1用欧拉降幂。如果模c之后为0,答案不是0,是c

#include<iostream>
#include<cmath>
using namespace std;
#define ll long long
ll gcd(ll a,ll b)
{
    return b?gcd(b,a%b):a;
}
ll phi(ll x)
{
    ll ret=x,a=x;
    for(ll i=2;i*i<=a;i++)
    {
        if(a%i==0)ret=ret/i*(i-1);
        while(a%i==0)a/=i;
    }
    if(a>1)ret=ret/a*(a-1);
    return ret;
}
ll poww(ll a,ll b,ll mod)
{
    ll ret=1;
    while(b)
    {
        if(b&1)ret=ret*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ret;
}
ll getNum(string s,ll mod)
{
    ll ret=0,len=s.size();
    for(int i=0;i<len;i++)
    ret=(ret*10+s[i]-'0')%mod;
    return ret;
}
int main()
{
    string b,n;
    ll c;
    cin>>b>>n>>c;
    ll bb=getNum(b,c),ph=phi(c),d=gcd(bb,c),ans;
    if(n.size()<10)
    {
        ll nn=getNum(n,1ll*1e15)-1;
        if(d==1)ans=((bb-1+c)%c)*poww(bb,nn%ph,c)%c;
        else
        {
            if(nn<ph)ans=((bb-1+c)%c)*poww(bb,nn,c)%c;
            else ans=((bb-1+c)%c)*poww(bb,nn%ph+ph,c)%c;
        }
    }
    else
    {
        ll nn=(getNum(n,ph)-1+ph)%ph;
        if(d==1)ans=((bb-1+c)%c)*poww(bb,nn,c)%c;
        else ans=((bb-1+c)%c)*poww(bb,nn+ph,c)%c;
    }
    if(ans)cout<<ans<<endl;
    else cout<<c<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/chen99/p/12564677.html