【题目】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. tomcat错误日志监控脚本

    #!/usr/bin/env python #-*-coding:utf-8-*- #CreateDate:2017/04/14 #Author:Eivll0m #ScriptName:monitor ...

  2. “Unable to open kernel device \\.\Global\vmx86

    启动vm中虚拟机中的时候,弹出窗口的时候,弹出窗口 Unable to open kernel device \\.\Global\vmx86;系统找不到指定的文件,Did you reboot af ...

  3. IE下Userdata本地化存储

    这两天看了下Discuz x2发帖的实时保存机制,涉及到本地化存储,所以上网查了下,Firefox等支持HTML5的浏览器使用window.localStorage或window.sessionSto ...

  4. UVALive3713_Astronauts

    有n个宇航员,根据年龄限制,所有宇航员只能从事A或B中的一种任务,所有人都可以从事C的任务.有的宇航员之间相互讨厌,不能分在一组,求出一种满足条件的分配方案. 2sat.mark[]中i+i和i+i+ ...

  5. linux 配置文件(启动文件、环境文件)启动顺序

    1.登录shell 登录shell时,linux会按一定规则读取启动几个配置文件: /ect/profile $HOME/.bash_profile $HOME/.bashrc $HOME/.bash ...

  6. Nginx4大模块——proxy、headers、upstream、stream

    一:ngx_http_proxy_module 反向代理( reverse proxy) 方式是指用代理服务器来接受 Internet 上的连接请求, 然后将请求转发给内部网络中的上游服务器, 并将从 ...

  7. 关于BIO和NIO的理解

    摘要: 关于BIO和NIO的理解 最近大概看了ZooKeeper和Mina的源码发现都是用Java NIO实现的,所以有必要搞清楚什么是NIO.下面是我结合网络资料自己总结的,为了节约时间图示随便画的 ...

  8. java的finally用法

    finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下. 之前在写爬虫的时候数据 ...

  9. plsql 只有三个文本框,无法登陆

    plsql版本与oracle版本不一致,如  你装的是oracle 64位,但是plsql装的是32位,就会出问题了,解决方案就是下载个64位plsql

  10. [BJOI2017]树的难题 点分治 线段树

    题面 [BJOI2017]树的难题 题解 考虑点分治. 对于每个点,将所有边按照颜色排序. 那么只需要考虑如何合并2条链. 有2种情况. 合并路径的接口处2条路径颜色不同 合并路径的接口处2条路径颜色 ...