1. 程式人生 > 其它 >CF906D Power Tower

CF906D Power Tower

技術標籤:CF刷題集CF906PowerTower

文章目錄

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+3Ar,答案對 m m m取模

資料範圍: n ≤ 1 0 5 , m ≤ 1 0 9 n\leq 10^5,m\leq 10^9 n105,m109


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) abab(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) ababmodφ(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);
	}
}