扩展欧拉定理

CF906D Power Tower

洛谷交的第二个黑题

题意

给出一个序列\(w-1,w_2,\cdots,w_n\),以及\(q\)个询问

每个询问给出\(l,r\),求:

\[w_l^{w_{l+1}^{w_{l+2}^{\cdots^{w_r}}}}\bmod p
\]

\(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的更多相关文章

  1. 【CodeForces】906 D. Power Tower 扩展欧拉定理

    [题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [ ...

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

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

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

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

  4. 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 ...

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

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

  6. [Codeforces]906D Power Tower

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

  7. D - Power Tower欧拉降幂公式

    题意:给你一个数组a,q次查询,每次l,r,要求 \(a_{l}^{a_{l+1}}^{a_{l+2}}...{a_r}\) 题解:由欧拉降幂可知,最多log次eu(m)肯定变1,那么直接暴力即可,还 ...

  8. Codeforces 906 D. Power Tower

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

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

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

随机推荐

  1. MTK Android 如何获取系统权限

    Android如何获得系统(system)权限 Android中如何修改系统时间(应用程序获得系统权限) 在 android 的API中有提供 SystemClock.setCurrentTimeMi ...

  2. Java第二十八天,Lambda表达式

    一.函数式编程 1.什么是函数式编程 函数式编程是种编程方式,是一种编程的思维,它属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用.它的地位等同于面向对象 ...

  3. Flask 入门(十二)

    Blueprint ,听说过么? 那必须的啊!但它是干嗒的?也不难理解! 如果你的项目是一个公司,Blueprint就是治理你的公司的 没有Blueprint,你的公司除了老板就是员公 有了Bluep ...

  4. Boyer-Moore字符串搜索(BM算法)的Python实现

    BM算法根据两个判据来进行字符串匹配,分别是“坏字符规则”和‘好后缀规则",其中好后缀规则可以单独使用,算法的图解可以参照下面这篇博文: https://www.cnblogs.com/wx ...

  5. alg-链表中有环

    typedef struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }ListN ...

  6. 关于gpu版本的tensorflow+anaconda+jupyter的一些安装问题(持续更新)

    关于anaconda安装,虽然清华镜像站资源很丰富,但是不知道是网络还是运气的问题,用这个路径安装的时候总是出现文件丢失.具体表现可能是anaconda prompt 找不到,conda命令无效等问题 ...

  7. tensorflow2.x 报错 Could not load dynamic library 'cudart64_101.dll'

    当我们使用 tensorflow 最新版本的时候 ,会出现这样的错误 -- ::] Could not load dynamic library 'cudart64_101.dll'; dlerror ...

  8. C. Primes and Multiplication

    题目连接:https://codeforces.com/contest/1228/problem/C 题目大意:g(x,y)==y^k(其中y^k是X的最大可以整除因子) f(x,y)==g(x,p1 ...

  9. OkHttp 优雅封装 HttpUtils 之 上传下载解密

    曾经在代码里放荡不羁,如今在博文中日夜兼行,只为今天与你分享成果.如果觉得本文有用,记得关注我,我将带给你更多. 还没看过第一篇文章的欢迎移步:OkHttp 优雅封装 HttpUtils 之气海雪山初 ...

  10. 本地同时使用多个git账号

    config文件说明 Git Document指示在首次安装git的时候需要配置Config的相关内容信息,有三个地方存储了config文件,决定了读取的场景不同. 1 /etc/gitconfig: ...