CF906D Power Tower
扩展欧拉定理
洛谷交的第二个黑题
题意
给出一个序列\(w-1,w_2,\cdots,w_n\),以及\(q\)个询问
每个询问给出\(l,r\),求:
\]
\(w_i\le 10^9,p\le 10^9,n\le 10^5,q\le 10^5\)
相似题:P4139 上帝与集合的正确用法
都是用欧拉函数,如果你不知道扩展欧拉定理是啥,看这里
和那题一样,递归的处理指数,和\(p\)取模,然后每递归一层,就让\(p\leftarrow \varphi(p)\)
然后这样一层层递归下去,直到\(p=1\)或者\(l=r\)
对于任意一个偶数\(p\),总有\(\varphi(p)\le \dfrac{p}{2}\),因为在小于等于它的数中,一定会有\(\dfrac{p}{2}\)个数是二的倍数,不和他互质
然后又因为对于\(p>2\),总有\(\varphi(p)\)为偶数,原因是当\(\gcd(d,p)=1,\gcd(p-d,p)=1\)(这个可以由反证法很容易的得出)
所以,对于任意一个\(p\),先经过一次给他变成\(\varphi(p)\),然后只要\(\log\)次就可以把它变成\(1\),所以递归最多\(O(\log p)\)层
但是要开一个map来记录已经算出的\(\varphi\),否则\(O(q\log p\sqrt p)\)跑不出来
还有一个问题,就是扩展欧拉定理的应用条件是\(b\ge \varphi(p)\),\(b\)是指数
所以要判断一下\(b\)和\(\varphi(p)\)的大小关系,然而那个上帝与集合的题不用这样,因为那个是无限个\(2\)在指数上,显然\(b>\varphi(p)\)
但是,我们在下一层递归中返回的,已经是对\(\varphi(p)\)取模以后\(b\)的值了,不是真实值,无法比较
如果同时记录真实值和取模后的值又比较麻烦,所以考虑每次取模,都是如果大于等于模数,就让他取模后再加上模数,如果小于模数当然就不管
结束递归回溯的时候也要取模
\(\texttt{code.}\)
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<map>
#define reg register
#define EN std::puts("")
#define LL long long
inline LL read(){
register LL x=0;register int y=1;
register char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int w[100006];
std::map<LL,LL>map;
inline LL get_phi(LL n){
if(map.find(n)!=map.end()) return map[n];
LL ret=n;
for(reg LL i=2;i*i<=n;i++){
if(!(n%i)) ret=ret/i*(i-1);
while(!(n%i)) n/=i;
}
if(n>1) ret=ret/n*(n-1);
map[n]=ret;
return ret;
}
inline LL mo(LL x,LL mod){
return x<mod?x:(x%mod+mod);
}
inline LL power(LL a,LL b,LL mod){
LL ret=1;
while(b){
if(b&1) ret=mo(ret*a,mod);
a=mo(a*a,mod);b>>=1;
}
return ret;
}
LL work(int l,int r,LL p){
if(l==r||p==1) return mo(w[l],p);
return power(w[l],work(l+1,r,get_phi(p)),p);
}
int main(){
LL n=read(),p=read();
for(reg int i=1;i<=n;i++) w[i]=read();
int q=read();while(q--){
int l=read(),r=read();
std::printf("%lld\n",work(l,r,p)%p);
}
return 0;
}
CF906D Power Tower的更多相关文章
- 【CodeForces】906 D. Power Tower 扩展欧拉定理
[题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [ ...
- CodeForces - 906D Power Tower(欧拉降幂定理)
Power Tower CodeForces - 906D 题目大意:有N个数字,然后给你q个区间,要你求每一个区间中所有的数字从左到右依次垒起来的次方的幂对m取模之后的数字是多少. 用到一个新知识, ...
- Codeforces 906D Power Tower(欧拉函数 + 欧拉公式)
题目链接 Power Tower 题意 给定一个序列,每次给定$l, r$ 求$w_{l}^{w_{l+1}^{w_{l+2}^{...^{w_{r}}}}}$ 对m取模的值 根据这个公式 每次 ...
- 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 ...
- CodeForces 907F Power Tower(扩展欧拉定理)
Priests of the Quetzalcoatl cult want to build a tower to represent a power of their god. Tower is u ...
- [Codeforces]906D Power Tower
虽说是一道裸题,但还是让小C学到了一点姿势的. Description 给定一个长度为n的数组w,模数m和询问次数q,每次询问给定l,r,求: 对m取模的值. Input 第一行两个整数n,m,表示数 ...
- D - Power Tower欧拉降幂公式
题意:给你一个数组a,q次查询,每次l,r,要求 \(a_{l}^{a_{l+1}}^{a_{l+2}}...{a_r}\) 题解:由欧拉降幂可知,最多log次eu(m)肯定变1,那么直接暴力即可,还 ...
- Codeforces 906 D. Power Tower
http://codeforces.com/contest/906/problem/D 欧拉降幂 #include<cstdio> #include<iostream> usi ...
- [CodeForces - 906D] Power Tower——扩展欧拉定理
题意 给你 $n$ 个 $w_i$ 和一个数 $p$,$q$个询问,每次询问一个区间 $[l,r] $,求 $w_l ^{w_{l+1}^{{\vdots}^{w_r}}} \ \% p$ 分析 由扩 ...
随机推荐
- 2015蓝桥杯分机号(C++C组)
标题:分机号X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如:751,520,321 都满足要求,而,766,918,201 就不符合要求.现 ...
- 初识指令重排序,Java 中的锁
本文是作者原创,版权归作者所有.若要转载,请注明出处.本文只贴我觉得比较重要的源码 指令重排序 Java语言规范JVM线程内部维持顺序化语义,即只要程序的最终结果与它顺序化情况的结果相等,那么指令的执 ...
- getline()和get()的使用区别
一.getline和get()的使用区别: 首先这两个函数都读取下一行输入,直到到达换行符:但是getline()函数会丢弃换行符,而get()将换行符保留在输入序列中 二.getline()函数的使 ...
- linux基础知识点扫描
1.tty:查看自己的虚拟终端 2.echo "你的服务器已经被我控制,请立刻打钱给我,账号12312312312314123421,否则后果自负!!!" > /dev/ ...
- nmon 的下一代工具 njmon
njmon njmon = nmon + JSON format + real-time push to a stats database + instant graphing of "al ...
- python从零开始基础入门——开发环境搭建:Visual Studio Code
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:山海皆可平z PS:如有需要Python学习资料的小伙伴可以加点击下方 ...
- D - A Game with Traps-- codeforces 1260D A
题目大意: 一共有m个士兵,k个陷阱,时间为t,一个首领,这个首领需要在t时间内尽可能多的将士兵带到boos的面前, 第二行是每个士兵的灵敏度. 紧接着是k个陷阱,每个陷阱有l,,r,,d组成,l代表 ...
- python机器学习入门-(1)
机器学习入门项目 如果你和我一样是一个机器学习小白,这里我将会带你进行一个简单项目带你入门机器学习.开始吧! 1.项目介绍 这个项目是针对鸢尾花进行分类,数据集是含鸢尾花的三个亚属的分类信息,通过机器 ...
- linq 高集成化数据访问技术
一: 新建名为linq的项目 创建 linq 1 在项目里添加文件夹 App_Code; 2 在文件夹(App_Code) 添加 名为db的 Linq To Sql 类 :一个Linq T ...
- 详解 Collection集合
(请关注 本人"集合总集篇"博文--<详解 集合框架>) 首先,本人来讲解下 Collection集合的继承体系: Collection集合 的继承体系: Collec ...