【题目】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

最新文章

  1. MySql事务概述
  2. OpenCV2简单的特征匹配
  3. 开放封闭原则(Open Closed Principle)
  4. java插入排序
  5. 1064. Complete Binary Search Tree (30)
  6. dedecms后台批量替换文章中的关键词
  7. Jquery暴力解数独
  8. css标准导航代码
  9. 分布式发布订阅消息系统 Kafka 架构设计[转]
  10. Spring配置静态目录
  11. Mongodb增加权限管理
  12. Ubuntu12.04 LTS Add Sources List
  13. UVa1583 Digit Generator
  14. dom4j解析xml文档全面介绍
  15. 创建mysql快捷登录方式
  16. LeetCode第十九题-链表节点的删除
  17. redis应用--HyperLogLog
  18. loadtxt函数
  19. function的toString方法
  20. Wireshark 过滤 基本语法

热门文章

  1. Internet History, Technology and Security (Week 5-1)
  2. 软工网络15团队作业8——Beta阶段项目总结
  3. selenium获取新页面标签页(只弹出一个新页面的切换)
  4. python基础(二)条件判断、循环、格式化输出
  5. [转帖]USB-C和Thunderbolt 3连接线你搞懂了吗?---没搞明白.
  6. 类似jq的即点即改
  7. Best Time to Buy and Sell Stock IV
  8. spring远程服务知识梳理
  9. Nagios学习笔记
  10. 【大数据】Spark基础解析