FZU - 1759 Super A^B mod C(欧拉降幂)

B的长度是1e6,所以需要欧拉降幂,利用 A^B %C ==A^( B%phi(C)+phi(C) ) %C

不加输入挂会T,加上直接93ms。。。

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
template <class T>
inline bool _cin(T &ret)
{
    char ch;
    if(ch = getchar(), ch == EOF) return 0;
    while(ch < '0' || ch > '9') ch = getchar();
    for(ret = 0; ch >= '0' && ch <= '9'; ch = getchar())
    	ret = ret * 10 + ch - '0';
    return 1;
}
template <class T>
void _cout(T ret)
{
    if(ret < 0)
    {
        putchar('-');
        ret = -ret;
    }
    if(ret > 9) _cout(ret/10);
    putchar(ret%10 + '0');
}

ll eular(ll n)
{
    ll ans=n;
    for(ll i=2;i*i<=n;i++)
    if(n%i==0)
    {
        ans-=ans/i;
        while(n%i==0)
            n/=i;
    }
    if(n>1) ans-=ans/n;
    return ans;
}
ll qmod(ll x,ll p,ll mod)
{
    ll ans=1;
    while(p)
    {
        if(p&1) ans=ans*x%mod;
        p/=2;
        x=x*x%mod;
    }
    return ans;
}
char s[1000005];
int main()
{
    ll a,b,c;
    while(_cin(a))
    {
        scanf("%s",s);
        _cin(c);
        ll tmp=eular(c);
        int n=strlen(s);
        b=0;
        for(int i=0;i<n;i++)
            b=(b*10+s[i]-'0')%tmp;//降幂
        _cout(qmod(a,b,c));puts("");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/dllpxfire/article/details/81272085