题意:给定一个长度为n的数组w,模数m和询问次数q,每次询问给定l,r,求:
对m取模的值。
思路:直接递归求解即可 详情看这里
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#define ll long long
using namespace std;
ll a[100010];
map<ll,ll>mp;
ll Mod(ll x,ll mod)
{
return x<mod?x:x%mod+mod;
}
ll lala(ll n)
{
ll k=n;
if(mp[n])
{
return mp[n];
}
ll ans=n;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
ans=ans/i*(i-1);
while(n%i==0)
{
n/=i;
}
}
}
if(n>1)
ans=ans/n*(n-1);
return mp[k]=ans;
}
ll power(ll a,ll b,ll c)
{
ll ans=1;
while(b)
{
if(b&1)
ans=Mod(ans*a,c);
a=Mod(a*a,c);
b>>=1;
}
return ans;
}
ll dfs(ll l,ll r,ll m)
{
if(l==r||m==1)
return Mod(a[l],m);
ll res=dfs(l+1,r,lala(m));
return power(a[l],res,m);
}
int main(){
int n,p;
cin>>n>>p;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int t;
cin>>t;
while(t--)
{
ll l,r;
cin>>l>>r;
cout<<dfs(l,r,p)%p<<endl;
}
return 0;
}