Codeforce-Power Tower(欧拉降幂)

Posted lcbwwy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforce-Power Tower(欧拉降幂)相关的知识,希望对你有一定的参考价值。

技术图片

Power Tower

题意:

  • 一个序列有(n)个数,(q)次询问,将(l)(r)这个区间的数叠起来模上(M)

思路:

  • 欧拉降幂
#include<bits/stdc++.h>
#define ll long long
using namespace std;
map<ll,ll>mp;
const int M=1e5+10;
ll a[M];
ll ol(ll x)
{
    if(mp[x])
    {
        return mp[x];
    }
    ll ans=x;
    ll n=x;
    for(int i=2;i*i<=n;i++)
    {
        if(x%i==0)
        {
            ans=ans*(i-1)/i;
        }
        while(x%i==0)
        {
            x/=i;
        }
    }
    if(x>1)
    {
        ans=ans*(x-1)/x;
    }
    mp[n]=ans;
    return ans;
}
ll query(ll a,ll mod)
{
    if(a<mod)
    {
        return a;
    }
    else
    {
        return a%mod+mod;
    }
    
}
ll pow(ll a,ll n,ll mod)
{
    ll ans=1;
    ll base=a;
    while(n)
    {
        if(n&1)
        {
            ans=query(ans*base,mod);
        }
        base=query(base*base,mod);
        n>>=1;
    }
    return ans;
}
ll solve(int l,int r,ll mod)
{
    if(r==l||mod==1)
    {
        return query(a[l],mod);
    }
    ll d=solve(l+1,r,ol(mod));
    return pow(a[l],d,mod);
}
int main( )
{
    int n,q,l,r;
    ll mod;
    //cout<<ol(28)<<endl;
    scanf("%d%lld",&n,&mod);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    scanf("%d",&q);
    while(q--)
    {
        scanf("%d%d",&l,&r);
        printf("%lld
",solve(l,r,mod)%mod);
    }
    return 0;
}

以上是关于Codeforce-Power Tower(欧拉降幂)的主要内容,如果未能解决你的问题,请参考以下文章

[CodeForces - 906D] Power Tower——扩展欧拉定理

CodeForces906 D. Power Tower 扩展欧拉定理

CodeForces 906D Power Tower <<欧拉降幂

CodeForces - 906D Power Tower(欧拉降幂定理)

CF906DPower Tower

BZOJ 1409 Password 数论(扩展欧拉+矩阵快速幂+快速幂)