【题目】D. Power Tower

【题意】给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案。n,q<=10^5,m,ai<=10^9。

【算法】扩展欧拉定理

【题解】扩展欧拉定理的形式:

$$a^b\equiv a^{b\%\varphi(p)+\varphi(p)} \ \ mod \ \ p \ \ (b\geq \varphi(p))$$

特别注意当b<φ(p)且(a,p)≠1时不变

假如现在是三个累乘幂a^(b^c),那么根据扩展欧拉定理:

$$a^{b^c}\ \ mod \ \ p\equiv a^{b^c\%\varphi(p)+\varphi(p)} \ \ mod \ \ p$$

这样我们只需要计算:

$$b^c\ \ mod \ \ \varphi(p)$$

更多个累乘幂的时候只需要不断递归取φ,直至1为止(φ(1)=1)。可以证明至多log(p)次可以得到答案。

这样计算累乘幂的复杂度就是O(log p*log n),也即一次询问的极限复杂度。

这里过程中用到的欧拉函数至多log p个,直接暴力求解,预处理复杂度O(log p*√n),用map存储,实现中可以直接记忆化。

总复杂度O(q*log p*log n)。

#include<cstdio>
#include<map>
#define ll long long
bool isdigit(char c){return c>=''&&c<='';}
int read(){
int s=,t=;char c;
while(!isdigit(c=getchar()))if(c=='-')t=-;
do{s=s*+c-'';}while(isdigit(c=getchar()));
return s*t;
}
using namespace std;
const int maxn=;
map<int,int>p;
int a[maxn],n,m,q;
int phi(int n){
if(p.count(n))return p[n];
int ans=n,m=n;
for(int i=;i*i<=n;i++)if(n!=&&n%i==){
ans=ans/i*(i-);
while(n%i==)n/=i;
}
if(n>)ans=ans/n*(n-);
p[m]=ans;
return ans;
}
int mod(ll x,int y){return x<y?x:x%y+y;}//focus on add,because 2e9*2>int
int power(int x,int k,int m){
int ans=;
while(k){
if(k&)ans=mod(1ll*ans*x,m);
x=mod(1ll*x*x,m);
k>>=;
}
return ans;
}
int calc(int l,int r,int m){
if(l==r||m==)return mod(a[l],m);
return power(a[l],calc(l+,r,phi(m)),m);
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++)a[i]=read();
q=read();
while(q--){
int l=read(),r=read();
printf("%d\n",calc(l,r,m)%m);
}
return ;
}

实现:

1.递归过程中直接返回ans+mod,这样下一层就自带+φ(m)了,最后输出答案记得%m就可以了。

2.快速幂过程中的取模改为 int mod(ll x,int y){return x<y?x:x%y+y;} ,这样到某一次数字超过y之后,后面每次都会强制超过y然后+y直至最后一次。

【BZOJ】4869 相逢是问候

#2142. 「SHOI2017」相逢是问候

因为至多log次,所以暴力计算维护线段树,n个数字,每个至多log p次修改,每次都要重新计算一次log p,快速幂log n。所以复杂度O(n log3n)。

预处理phi的递归序列,然后转化为非递归计算常数比较小。

代码见:zsnuo

有一种优化方法,因为快速幂至多1e8且都是以c为底,可以预处理c^(0~1e4),令t=c^(1e4),再预处理t^(0~1e4),这样对于一个数字查一下大表t再定位到小表c就行了。

这就是传说中的分段打表,具体见:ripped

【CodeForces】906 D. Power Tower 扩展欧拉定理的更多相关文章

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

    Priests of the Quetzalcoatl cult want to build a tower to represent a power of their god. Tower is u ...

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

    题意 给你 $n$ 个 $w_i$ 和一个数 $p$,$q$个询问,每次询问一个区间 $[l,r] $,求 $w_l ^{w_{l+1}^{{\vdots}^{w_r}}} \ \% p$ 分析 由扩 ...

  3. Codeforces 906 D. Power Tower

    http://codeforces.com/contest/906/problem/D 欧拉降幂 #include<cstdio> #include<iostream> usi ...

  4. [Codeforces]906D Power Tower

    虽说是一道裸题,但还是让小C学到了一点姿势的. Description 给定一个长度为n的数组w,模数m和询问次数q,每次询问给定l,r,求: 对m取模的值. Input 第一行两个整数n,m,表示数 ...

  5. CodeForces - 906D Power Tower(欧拉降幂定理)

    Power Tower CodeForces - 906D 题目大意:有N个数字,然后给你q个区间,要你求每一个区间中所有的数字从左到右依次垒起来的次方的幂对m取模之后的数字是多少. 用到一个新知识, ...

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

    题目链接  Power Tower 题意  给定一个序列,每次给定$l, r$ 求$w_{l}^{w_{l+1}^{w_{l+2}^{...^{w_{r}}}}}$  对m取模的值 根据这个公式 每次 ...

  7. Codeforces Round #454 D. Power Tower (广义欧拉降幂)

    D. Power Tower time limit per test 4.5 seconds memory limit per test 256 megabytes input standard in ...

  8. CF906D Power Tower

    扩展欧拉定理 CF906D Power Tower 洛谷交的第二个黑题 题意 给出一个序列\(w-1,w_2,\cdots,w_n\),以及\(q\)个询问 每个询问给出\(l,r\),求: \[w_ ...

  9. [luogu4139]上帝与集合的正确用法【欧拉定理+扩展欧拉定理】

    题目大意 让你求\(2^{2^{2^{\cdots}}}(mod)P\)的值. 前置知识 知识1:无限次幂怎么解决 让我们先来看一道全国数学竞赛的一道水题: 让你求解:\(x^{x^{x^{\cdot ...

随机推荐

  1. Python入门:参数传递方式

    这是关于Python的第5篇文章,主要介绍下参数传递方式和如何设计自己的函数. (一) 本篇主要介绍2种参数传递方式. 位置参数 调用函数时,根据函数定义的参数位置来传递参数. def right_t ...

  2. Sql Server自增ID与序号的使用

    SQL 自增ID alter table a add id int identity(1,1) not null 这里为 a 表增加一个 id 字段,其中identity(1,1)代表自增,第一个1代 ...

  3. 【转】python win32api win32gui win32con 简单操作教程(窗口句柄 发送消息 常用方法 键盘输入)

    作者:https://blog.csdn.net/qq_16234613/article/details/79155632 附:https://www.programcreek.com/python/ ...

  4. 关于对JSON.parse()与JSON.stringify()的理解

    JSON.parse()与JSON.stringify()的区别   JSON.parse()[从一个字符串中解析出json对象] 例子: //定义一个字符串 var data='{"nam ...

  5. Eclipse_生成webservice客户端

    1.工具:eclipse3.3或者是带有webservice插件的eclipse wsdl2java(这个本人没用过,具体长什么样不清楚) 2.步骤: 首先用浏览器访问webservice的站点,点击 ...

  6. [转帖].net 4.8 将不再支持win7 win8 版本

    ZT:https://blogs.msdn.microsoft.com/dotnet/2018/07/18/announcing-net-framework-4-8-early-access-buil ...

  7. Swagger实现API文档功能

    介绍: wagger也称为Open API,Swagger从API文档中手动完成工作,并提供一系列用于生成,可视化和维护API文档的解决方案.简单的说就是一款让你更好的书写API文档的框架. 我们为什 ...

  8. 【uoj#280】[UTR #2]题目难度提升 对顶堆+STL-set

    题目描述 给出 $n$ 个数 $a_1,a_2,...,a_n$ ,将其排为序列 $\{p_i\}$ ,满足 $\{前\ i\ 个数的中位数\}$ 单调不降.求字典序最大的 $\{p_i\}$ . 其 ...

  9. SourceTree轻松Git项目

    这篇文档的目的是:让使用Git更轻松. 看完这篇文档你能做到的是: 1.简单的用Git管理项目. 2.怎样既要开发又要处理发布出去的版本bug情况. SourceTree是一个免费的Git图形化管理工 ...

  10. 让你的wordpress在新窗口打开链接

    在使用wordpress过程中笔者发现还有一些不太完善的地方,没有充分考虑到用户体验.所以,在使用wordpress建博之初,我们有必要对wordpress进行一次小改造,让wordpress更个性. ...