原题为2017六省联考的D1T3

给出一个序列,m次操作,模数p和参数c
操作分为两种:
1、将[l,r]区间内的每个数x变为\(c^x\)
2、求[l,r]区间内数的和%p


首先,我们要了解一些数论姿势:
1、扩展欧拉定理
//我们熟知的费马小定理用于p是质数,欧拉定理用于a,p互质,而这道题都不满足这个限制
当\((b>=\phi(p))\)时,\(a^b=a^{b\mod \phi(p) + \phi(p)}\)
2、(其实不算数论姿势)一个数最多经过log此\(\phi\)就会变成1

所以我们发现,一个数在经过几次变化后,指数永远是\(x\mod1+1\),也就是1,它就再也不变了!
//上面这里不理解的话,可以考虑这样一道题
//给定一个长度为n的序列a,每次询问区间[l,r] \(a_l^{a_{l+1}^{…}}\)的值。\(n<=10^5,m<=10^9\)
//原题应该是叫power tower

所以我们建一棵线段树,维护当前区间和和这个区间中被修改的最小次数。
预处理出对于mod p来讲,几次后一定会不变,记为k。每次修改将当前位置的修改次数++。如果这个区间的最小修改次数>=k,那么就不需要修改了,否则暴力修改。
因为每次的修改次数不一样,所以要用初值a[i]计算times后当前数会变为什么。

因为有n个数,每个数会被暴力修改\(\log(p)\)次,每次修改是\(\log(n)\)的,再乘上快速幂的复杂度\(\log\)就是\(O(nlog^3)\)
这样基本能过了,但是被卡常的话就不稳了。可以考虑预处理c的快速幂,反正c是固定的……
//bzoj不预处理就能过,洛谷过不了(也可能是博主写的比较菜)

贴一份没有预处理的代码

#include<cstdio>
#include<algorithm>
#define N 50010
#define M 10010
typedef long long ll;
using namespace std;
int a[N],n,m,prime[N],tot,p[N],P,c,op,l,r,k,MOD;
bool np[N];
struct hhh
{int l,r,sum,is;
}tre[4*N];int read()
{int ans=0,fu=1;char j=getchar();for (;j<'0' || j>'9';j=getchar()) if (j=='-') fu=-1;for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';return ans*fu;
}int ksm(int x,int y,int mo,bool &flag)
{int ret=1;bool big=0;while (y){if (y&1){flag|=big|((ll)ret*x>=mo);ret=(ll)ret*x%mo;}if ((ll)x*x>=mo) big=1;x=(ll)x*x%mo;y>>=1;}return ret;
}void build(int i,int l,int r)
{tre[i].l=l;tre[i].r=r;tre[i].is=0;if (l==r){tre[i].sum=a[l]%P;return ;}int mid=(l+r)>>1;build(i*2,l,mid);build(i*2+1,mid+1,r);tre[i].sum=(tre[i*2].sum+tre[i*2+1].sum)%P;
}int calc(int x,int dep)
{int ret=x;if (ret>=p[dep]) ret=ret%p[dep]+p[dep];while (dep){dep--;bool flag=0;ret=ksm(c,ret,p[dep],flag);if (flag) ret+=p[dep];}return ret%P;
}void modify(int i,int l,int r)
{if (l>tre[i].r || r<tre[i].l) return ;if (tre[i].is>=k) return ;if (tre[i].l==tre[i].r){tre[i].is++;tre[i].sum=calc(a[tre[i].l],tre[i].is);return ;}modify(i*2,l,r);modify(i*2+1,l,r);tre[i].sum=(tre[i*2].sum+tre[i*2+1].sum)%P;tre[i].is=min(tre[i*2].is,tre[i*2+1].is);
}int query(int i,int l,int r)
{if (l>tre[i].r || r<tre[i].l) return 0;if (tre[i].l>=l && tre[i].r<=r) return tre[i].sum;return (query(i*2,l,r)+query(i*2+1,l,r))%P;
}int phi(int n)
{int res=n,a=n;for(int i=2; i*i<=a; i++)if(a%i==0){res=res/i*(i-1);while (a%i==0) a/=i;}if (a>1) res=res/a*(a-1);return res;
}int main()
{n=read();m=read();P=read();c=read();for (int i=1;i<=n;i++) a[i]=read();p[0]=P;while (p[k]!=1) { ++k; p[k]=phi(p[k-1]); }p[++k]=1;build(1,1,n);while (m--){op=read();l=read();r=read();if (op) printf("%d\n",query(1,l,r));else modify(1,l,r);}return 0;
}

转载于:https://www.cnblogs.com/mrha/p/8318947.html

[LNOI] 相逢是问候 || 扩展欧拉函数+线段树相关推荐

  1. bzoj4869: [Shoi2017]相逢是问候(欧拉函数+线段树)

    这题是六省联考的...据说数据还出了点锅,心疼六省选手QAQ 首先要知道扩展欧拉定理... 可以发现每次区间操作都会使模数进行一次phi操作,而一个数最多取logp次phi就会变成1,这时后面的指数就 ...

  2. bzoj 5245: [Fjwc2018]欧拉函数 线段树+bitset

    题意 对于正整数 n,定义欧拉函数 φ(n) 为小于等于 n 且与 n 互质的正整数个数.例如 φ(1) = 1, φ(8) = 4. 给定正整数序列 a1, a2, · · · , an,请依次执行 ...

  3. jzoj4638-第三条跑道【欧拉函数,线段树】

    正题 题目大意 要求支持区间乘和区间求∏φ(xi)\prod \varphi(x_i)∏φ(xi​) 解题思路 首先φ(n)=n∗∏(pi−1pi)\varphi(n)=n*\prod (\frac{ ...

  4. [BZOJ 4034][HAOI2015]树上操作(欧拉序列+线段树)

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...

  5. 数论一之定理证明——裴蜀/威尔逊/费马/扩展欧几里得/[扩展]欧拉/[扩展]中国剩余定理,欧拉函数,逆元,剩余系,筛法

    打死没想到会在H老师处学懂数论 同余,整除 模运算 埃式筛法 欧拉筛法 最大公约数和最小公倍数 辗转相除法 更相减损术 裴蜀定理 威尔逊定理 费马定理 同余等价类.剩余系.缩系 欧拉函数 欧拉定理 扩 ...

  6. 欧拉函数|(扩展)欧拉定理|欧拉反演

    也许更好的阅读体验 文章目录 欧拉函数 欧拉函数常用性质 欧拉定理 扩展欧拉定理 线性筛法 欧拉反演 欧拉函数 定义 欧拉函数是 小于等于 x的数中与x 互质 的数的 数目 符号 φ ( x ) \v ...

  7. 原根(扩展欧几里得+欧拉函数)

    1135 原根 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 设m是正整数,a是整数,若a模m的阶等于φ(m),则称a为模m的一个原根.(其中φ(m)表示m的欧拉函数) ...

  8. 【HDU 2814 扩展欧拉 a^b ≡ (a mod c)^b mod ϕ(c)+ϕ(c) modc,b=ϕ(c) 】

    G(1)=F(ab)G(1)=F(ab)  G(n)=G(n−1)F(ab)(n>=2)G(n)=G(n−1)F(ab)(n>=2) 求G(n)modc 具体: In mathematic ...

  9. 欧拉降幂及其扩展欧拉降幂

    欧拉降幂: 从公式来看,需要使用快速幂运算和欧拉函数 #include<bits/stdc++.h>using namespace std; typedef __int64 LL;cons ...

最新文章

  1. 软件工程技术基础-(软件复用技术)
  2. php连接mysql数据库测试_php连接mysql数据库连接测试文件
  3. 【数据挖掘】K-Means 二维数据聚类分析 ( K-Means 迭代总结 | K-Means 初始中心点选择方案 | K-Means 算法优缺点 | K-Means 算法变种 )
  4. Linux 下配置 phpredis 的过程和遇到的问题
  5. sublime快捷键设置
  6. SpringNet整合NHibernate相关配置
  7. Java解析XML并自动写入Excel
  8. “Win10系统更新后,插上主机耳机孔,没有声音 / 扬声器未插入”解决方法
  9. Redis常用命令总结,为什么阿里的程序员成长如此之快
  10. markdown编辑器Typora的使用方法(保姆级教程)
  11. c语言英文版孤独怎么说,孤独的伤感的英文句子
  12. org.dom4j.DocumentException: 1 字节的 UTF-8 序列的字节 1 无效。
  13. 软件架构详解(附图)
  14. 【Markdown】编辑器使用技巧大汇总3。省略号的表示,常见希腊字母($\lambda$ 等),常见数学符号($\times$ 等),三角函数表示符号,微积分表示符号,逻辑运算符(因为所以)
  15. 实验6 蓝桥ROS1使用moveit 适用kinetic/melodic/noetic
  16. 考研数二第十一讲 罗尔中值和拉格朗日定理与柯西中值定理
  17. 怎么用Java来操作Word和Excel?
  18. 100多万个视频短片数据集来啦!
  19. CC2541之OAD
  20. 机架服务器扩展硬盘柜,Infortrend JBOD 和扩展柜用于服务器和存储 | Infortrend

热门文章

  1. 中国量子计算机 是纠缠,量子纠缠获得突破,中国量子计算机问世,民营企业立下显著功勋...
  2. hue集成mysql报错_hue集成hive访问报database is locked
  3. python os.path
  4. scrapy.spider
  5. c++ 友元函数,友元类
  6. tesseract库
  7. pyqt怎么button怎么链接_SEO内部链接怎么优化
  8. 数据传输服务 DTS > 数据迁移 > 从自建数据库迁移至阿里云 > 源库为MySQL > 从自建MySQL迁移至RDS MySQL
  9. VMware NSX part 1(介绍) part 2(NSX-Manager安装) part 3(NSX Controller部署)
  10. .net5 不支持winform_「开源资讯」.NET 5.0 RC 2 发布