Codeforce-Power Tower(欧拉降幂)
Posted lcbwwy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforce-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 <<欧拉降幂