Discription

Priests of the Quetzalcoatl cult want to build a tower to represent a power of their god. Tower is usually made of power-charged rocks. It is built with the help of rare magic by levitating the current top of tower and adding rocks at its bottom. If top, which is built from k - 1 rocks, possesses power p and we want to add the rock charged with power wk then value of power of a new tower will be {wk}p.

Rocks are added from the last to the first. That is for sequence w1, ..., wm value of power will be

Codeforces 906 D Power Tower

After tower is built, its power may be extremely large. But still priests want to get some information about it, namely they want to know a number called cumulative power which is the true value of power taken modulo m. Priests have n rocks numbered from 1 to n. They ask you to calculate which value of cumulative power will the tower possess if they will build it from rocks numbered l, l + 1, ..., r.

Input

First line of input contains two integers n (1 ≤ n ≤ 105) and m (1 ≤ m ≤ 109).

Second line of input contains n integers wk (1 ≤ wk ≤ 109) which is the power of rocks that priests have.

Third line of input contains single integer q (1 ≤ q ≤ 105) which is amount of queries from priests to you.

kth of next q lines contains two integers lk and rk (1 ≤ lk ≤ rk ≤ n).

Output

Output q integers. k-th of them must be the amount of cumulative power the tower will have if is built from rocks lk, lk + 1, ..., rk.

Example

Input
6 1000000000
1 2 2 3 3 3
8
1 1
1 6
2 2
2 3
2 4
4 4
4 5
4 6
Output
1
1
2
4
256
3
27
597484987

Note

327 = 7625597484987

 

 

首先你得需要知道一个定理:

当x>φ(p)时,a^x  mod p=a^(x mod φ(p)  +φ(p))  mod p。

因为φ(x)迭代不超过log(x)次就成1了(考虑2这个质因子),所以我们直接暴力迭代就行了。

由于我们并不知道下一层的值(也就是这一层的次数)是否大于φ(p),所以%p改成%2p就行了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<map>
#define ll long long
#define maxn 100005
using namespace std;
ll a[maxn],n,mod[105],l,r,q,tot=0;

inline ll MO(ll x,ll y){
    return x>y?x%y+y:x;
}

inline ll ksm(ll x,ll y,const ll ha){
    ll an=1;
    for(;y;y>>=1,x=MO(x*x,ha)) if(y&1) an=MO(an*x,ha);
    return an;
}

inline ll phi(ll x){
    int tp=sqrt(x+0.5),y=1;
    for(int i=2;i<=tp;i++) if(!(x%i)){
        x/=i,y*=i-1;
        while(!(x%i)) x/=i,y*=i;
        if(x==1) break;
    }
    if(x!=1) y*=x-1;
    return y;
}

ll solve(int now,ll mo){
    if(now==r||mo==1) return MO(a[now],mo);
    else return ksm(a[now],solve(now+1,mod[now-l+1]),mo);
}

int main(){
    scanf("%lld%lld",&n,mod);
    while(mod[tot]!=1) mod[tot+1]=phi(mod[tot]),tot++;
    
    for(int i=1;i<=n;i++) scanf("%lld",a+i);
    scanf("%lld",&q);
    while(q--){
        scanf("%lld%lld",&l,&r);
        ll ans=solve(l,mod[0]);
        if(ans>=mod[0]) ans-=mod[0];
        printf("%lld\n",ans);
    }
    
    return 0;
}

 

相关文章: