CF906D Power Tower
阿新 • • 發佈:2020-12-19
文章目錄
R e s u l t Result Result
H y p e r l i n k Hyperlink Hyperlink
https://www.luogu.com.cn/problem/CF906D
D e s c r i p t i o n Description Description
給定一個長度為
n
n
n的序列
A
A
A,
q
q
q次詢問
每次詢問給定一個區間
[
l
,
r
]
[l,r]
[l,r]
求
A
l
A
l
+
1
A
l
+
2
A
l
+
3
…
…
A
r
A_l^{A_{l+1}^{A_{l+2}^{A_{l+3}^{……^{A^r}}}}}
AlAl+1Al+2Al+3……Ar,答案對
m
m
m取模
資料範圍: n ≤ 1 0 5 , m ≤ 1 0 9 n\leq 10^5,m\leq 10^9 n≤105,m≤109
S
o
l
u
t
i
o
n
Solution
Solution
引擴充套件尤拉定理:
當
b
<
φ
(
p
)
b<\varphi(p)
b<φ(p)時,
a
b
≡
a
b
(
m
o
d
p
)
a^b\equiv a^{b}(\mod p)
ab≡ab(modp)
當
b
≥
φ
(
p
)
b\geq \varphi(p)
b≥φ(p)時,
a
b
≡
a
b
m
o
d
φ
(
p
)
+
φ
(
p
)
(
m
o
d
p
)
a^b\equiv a^{b\mod \varphi(p)+\varphi(p)}(\mod p)
ab≡abmodφ(p)+φ(p)(modp)
遞迴的層數不會超過
log
2
m
\log_ 2m
log2m層,預處理對應的
φ
\varphi
φ即可
時間複雜度: O ( n log 2 2 m ) O(n\log_2 ^2 m) O(nlog22m)
C o d e Code Code
#include<map>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;int n,m,a[100010],q,l,r;
map<int,int>ph;
inline LL read()
{
char c;LL d=1,f=0;
while(c=getchar(),!isdigit(c)) if(c=='-') d=-1;f=(f<<3)+(f<<1)+c-48;
while(c=getchar(),isdigit(c)) f=(f<<3)+(f<<1)+c-48;
return d*f;
}
inline int phi(int x)
{
int y=x;
for(int i=2;i*i<=x;i++)
if(x%i==0)
{
y=y/i*(i-1);
do{x/=i;}while(x%i==0);
}
if(x!=1) y=y/x*(x-1);
return y;
}
inline int Mul(int x,int y,int mod){if((LL)x*y<mod) return x*y;return (LL)x*y%mod+mod;}
inline int ksm(int x,int y,int mod)
{
int res=1;
for(;y;y>>=1,x=Mul(x,x,mod)) if(y&1) res=Mul(res,x,mod);
return res;
}
inline int dfs(int x,int p)
{
if(x==r+1||p==1) return 1;
int t=dfs(x+1,ph[p]);
return ksm(a[x],t,p);
}
signed main()
{
n=read();m=read();
int tmp=m;
while(tmp!=1) ph[tmp]=phi(tmp),tmp=ph[tmp];
ph[tmp]=1;
for(register int i=1;i<=n;i++) a[i]=read();
q=read();
while(q--)
{
l=read();r=read();
printf("%d\n",dfs(l,m)%m);
}
}