S
o
u
r
c
e
:
Source:
Source: Codeforces Round #454
P
r
o
b
l
e
m
:
Problem:
Problem: 欧拉降幂公式。改进了一下之前的写法。
C
o
d
e
:
Code:
Code:
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ALL(A) (A).begin(), (A).end()
#define CLR(A, X) memset(A, X, sizeof(A))
typedef long long LL;
typedef pair<int, int> PII;
const double eps = 1e-10;
const double PI = acos(-1.0);
const auto INF = 0x3f3f3f3f;
int dcmp(double x) { if(fabs(x) < eps) return 0; return x<0?-1:1; }
const int MAXN = 1e5+10;
const LL MOD = 1e9+7;
int a[MAXN], phi[MAXN];
int get(int n) {
int ret = n;
for(int i = 2; i*i <= n; i++) if(n%i == 0) {
ret = ret/i*(i-1);
while(n%i == 0) n /= i;
}
if(n != 1) ret = ret/n*(n-1);
return ret;
}
int gao(LL x, int m) {
return x>=m?x%m+m:x;
}
int qpow(int a, int b, int m) {
int ret = 1;
while(b) {
if(b & 1) ret = gao(1LL*ret*a, m);
a = gao(1LL*a*a, m);
b >>= 1;
}
return ret;
}
int dfs(int l, int r, int i) {
if(l==r || phi[i]==1) return gao(a[l], phi[i]);
return qpow(a[l], dfs(l+1, r, i+1), phi[i]);
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
phi[0] = m;
for(int i = 1; i < 30; i++) {
phi[i] = get(phi[i-1]);
}
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
int q;
scanf("%d", &q);
while(q--) {
int l, r;
scanf("%d%d", &l, &r);
printf("%d\n", dfs(l, r, 0)%m);
}
return 0;
}