Codeforces 906D Power Tower(欧拉函数 + 欧拉公式)

题目链接  Power Tower

题意  给定一个序列,每次给定$l, r$

   求$w_{l}^{w_{l+1}^{w_{l+2}^{...^{w_{r}}}}}$  对m取模的值

根据这个公式

每次递归计算。

因为欧拉函数不断迭代,下降到$1$的级别大概是$log(m)$的,那么对于每一次询问最多需要递归$log(m)$次

注意每次求解欧拉函数的时候要用map存下来,方便以后查询

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)	for (int i(a); i <= (b); ++i)
#define dec(i, a, b)	for (int i(a); i >= (b); --i)

typedef long long LL;

const int N = 1e5 + 10;

int n, q;
LL a[N];
LL m;
map <LL, LL> f;

LL phi(LL n){
	if (f.count(n)) return f[n];
	LL ans = n, z = n;
	for (LL i = 2; i * i <= n; ++i){
		if (n % i == 0){
			ans -= ans / i;
			while (n % i == 0) n /= i;
		}
	}

	if (n > 1) ans -= ans / n;
	return f[z] = ans;
}

LL Pow(LL a, LL b, LL mod){
	LL ret = 1;
	LL fl  = a >= mod;
	for (; b; b >>= 1){
		if (b & 1){
			ret *= a;
			if (ret >= mod) fl = 1, ret %= mod;
		}

		a *= a;
		if (a >= mod) a %= mod, fl = 1;
	}

	return ret + fl * mod;
}

LL solve(int l, int r, LL mod){
	if (l == r) return a[l];
	if (mod == 1) return 1;
	return Pow(a[l], solve(l + 1, r, phi(mod)), mod);
}

int main(){

	scanf("%d%lld", &n, &m);
	rep(i, 1, n) scanf("%lld", a + i);

	scanf("%d", &q);
	while (q--){
		int x, y;
		scanf("%d%d", &x, &y);
		printf("%lld\n", solve(x, y, m) % m);
	}

	return 0;
}

  

原文地址:https://www.cnblogs.com/cxhscst2/p/8374885.html

时间: 2024-10-07 22:43:37

Codeforces 906D Power Tower(欧拉函数 + 欧拉公式)的相关文章

CodeForces 906D Power Tower &lt;&lt;欧拉降幂

题意 给定n个数,q次询问,每次输出[l,r]区间的超级幂,对m取模. 思路 超级幂问题就想到用欧拉降幂来处理 欧拉降幂公式:$a^b \% m=a^{b\%\varphi (m)+\varphi(m)}\%m,(b>\varphi(m))$ 本题用递归处理欧拉降幂,在$logm$次降幂后$\varphi(m)=1$,然后回溯时用快速幂进行计算,总的复杂度大约是$log^{2}m$ $w_0^{w_1^{w_2^{w_3^{...}}}}\% m = w_0^{[w_1^{w_2^{w_3^{.

Codeforces 871D Paths (欧拉函数 + 结论)

题目链接  Round  #440  Div 1  Problem D 题意   把每个数看成一个点,如果$gcd(x, y) \neq 1$,则在$x$和$y$之间连一条长度为$1$的无向边.    设$d(u, v)$为$u$到$v$之间的最短路,如果$u$和v不连通那么$d(u, v) = 0$    现在给定$n$,求所有的满足$1 <= u < v <= n$的$d(u, v)$之和. 首先把$1$和大于$\frac{n}{2}$的质数去掉,这些数和任何数之间的最短距离为$0$

[CodeForces - 906D] Power Tower——扩展欧拉定理

题意 给你 $n$ 个数 $w$ 和一个数 $p$,$q$个询问,每次询问一个区间 $[l,r] $,求 $w_l^{(w_{l+1}^{(w_{l+2}…^{w_r})})}\mod p$. 分析 由扩展欧拉定理: $$a^b\equiv \begin{cases} a^{b\%\phi(p)}~~~~~~~~~~~gcd(a,p)=1\\ a^b~~~~~~~~~~~~~~~~~~gcd(a,p)\neq1,b<\phi(p)\\ a^{b\%\phi(p)+\phi(p)}~~~~gcd(

【自用】关于欧拉函数以及逆元的一些模板

求欧拉函数φ O()√时间复杂度的算法 首先我们要求φ(x),可以先将其分解成∏(apii)的形式,其中a是素数. 然后可以推导出公式φ(x)=∏(apii?api?1i) 然后这个可以实现为φ(x)=x/∏(ai?1) 这样就可以在√时间内出解了. 线性时间复杂度的算法 线性筛! 因为欧拉函数是积性函数,所以我们可以采用线性筛. 过程见下方代码getphi()函数. 基于欧拉函数的求逆元 首先有欧拉公式 xφ(p)%p==1 所以x?xφ(p)?1%p==1 这样xφ(p)?1就是x在mod

CodeForces 907F Power Tower(扩展欧拉定理)

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

欧拉函数小结

欧拉函数: φ(n)表示1~n中和n互素的数目 要处理出欧拉函数.先证明φ(p)=p-1.(p为素数) 根据互素的概念.两个数的公约数只有1,那么这两个数互素.再根据素数的定义.公约数除了本身以外只有1的数为素数.所以得证φ(p) = p-1. 再证明欧拉函数为不完全积性函数. φ(m1*m2) = φ(m1)*φ(m2) 其中 m1和m2互素.即gcd(m1,m2)=1. 证明过程在我另外一篇博文中.我觉得那种证明比较好.当然还有别的比较好的证明方法. http://www.cnblogs.c

欧拉函数+素数筛

欧拉函数,就是欧拉发现的一个关于求素数的的公式,然后我们编个函数实现这个公式. 欧拉发现求小于等于n的正整数中有多少个数与n互质可以用这个公式: euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数.euler(1)=1(唯一和1互质的数就是1本身). 欧拉公式的延伸:一个数的所有质因子之和是euler(n)*n/2. 其实直接看模板加注解想想就能看懂 筛选的原理就是找出n的因子,剔除含有

HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂

装载自:http://www.cnblogs.com/183zyz/archive/2012/05/11/2495401.html 题目让求一个函数调用了多少次.公式比较好推.f[n] = f[n-1]*f[n-2].然后a和b系数都是呈斐波那契规律增长的.需要先保存下来指数.但是太大了.在这里不能用小费马定理.要用降幂公式取模.(A^x)%C=A^(x%phi(C)+phi(C))%C(x>=phi(C)) Phi[C]表示不大于C的数中与C互质的数的个数,可以用欧拉函数来求. 矩阵快速幂也不

欧拉函数hdu——————1286

现在先来解释下欧拉函数的的定义: 就是  正整数n里  小于N且与N互质(gcd为1)的数. (度娘:在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目.此函数以其首名研究者欧拉命名,它又称为Euler's totient function.φ函数.欧拉商数等. 例如φ(8)=4,因为1,3,5,7均和8互质.) Problem Description 新年快到了,“猪头帮协会”准备搞一个聚会,已经知道现有会员N人,把会员从1到N编号,其中会长的号码是N号,凡是和会长是老朋友的,