Description
信息将你我连结。B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数。一共有m个操作,可以
分为两种:0 l r表示将第l个到第r个数(al,al+1,...,ar)中的每一个数ai替换为c^ai,即c的ai次方,其中c是
输入的一个常数,也就是执行赋值ai=c^ai1 l r求第l个到第r个数的和,也就是输出:sigma(ai),l<=i<=rai因为
这个结果可能会很大,所以你只需要输出结果mod p的值即可。
Input
第一行有三个整数n,m,p,c,所有整数含义见问题描述。
接下来一行n个整数,表示a数组的初始值。
接下来m行,每行三个整数,其中第一个整数表示了操作的类型。
如果是0的话,表示这是一个修改操作,操作的参数为l,r。
如果是1的话,表示这是一个询问操作,操作的参数为l,r。
1 ≤ n ≤ 50000, 1 ≤ m ≤ 50000, 1 ≤ p ≤ 100000000, 0 < c <p, 0 ≤ ai < p
Output
对于每个询问操作,输出一行,包括一个整数表示答案mod p的值。
Solution:
也是比较恶心的题目了。
综合了数论(欧拉公式,phi的求法,快速幂)+数据结构(线段树)+预处理(phi的迭代,快速幂指数根号拆分)
一道值得好好做的好题。
首先我们要知道扩展欧拉公式:
(温馨提示:
类似地有一道题:
上帝与集合的正确用法
这个题目是本题的简化简化简化简化。。。版。
先用扩展欧拉定理过了这道题才行。(虽然我用的CRT))
这个题目一看不可做
但是发现,根据扩展欧拉公式,即使有:
c^c^c^c^..^a
不断p取phi,大概logn次会变成1
证明:如果p是偶数,必然会至少有p/2个数不互质,会除以2
如果p是奇数,因为gcd(n,x)=gcd(n,n-x)=1,所以,与p互质的数成对出现,phi都是偶数(除了1,2)。p=phi(p)就变成了偶数。
每两次至少除以2
所以,一个位置最多被操作logp(设为up)次,值就不会再变了。因为若p=1时,根据欧拉公式第三条,指数一定都会是1。
所以,我们可以预处理每个位置操作up次后的值。
然后,区间修改,区间求和?线段树!
暴力区间修改,如果区间修改次数==up,则不再修改。
复杂度,大概:O(nlog^2n+mlogn)
细节问题:推荐:bzoj4869: [Shoi2017]相逢是问候(欧拉函数+线段树)
1.up要到Phi(1)=1,也就是说,如果p=4,要mod 4 、2、1 、1
2.