4869: [Shoi2017]相逢是问候

题意:一个序列,支持区间\(a_i \leftarrow c^{a_i}\),区间求和。在模p意义下。


类似于开根操作,每次取phi在log次后就不变了。

不互质怎么办? 我才知道,

\[n^x \equiv n^{x \mod \varphi(p)\ +\ \varphi(p)} \pmod p,\ x \ge \varphi(p)
\]

不要求互质,只要求\(x \ge \varphi(p)\)


然后就很好做了...线段树维护每个点的操作次数和和,修改的时候每个点算一下,不变的区间不再更新。


有一个问题,必须把\(\varphi(1)=1\)也加进去。我想了好久好久...因为

\[0 < \varphi(1) ,结果为0\\
2^x \ge \varphi(1), 结果为1
\]

如果这个序列的数是0,再加一层之后和之前并不是不变的!


然后需要给快速幂加点特技...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
#define mid ((l+r)>>1)
#define lc x<<1
#define rc x<<1|1
#define lson lc, l, mid
#define rson rc, mid+1, r
const int N = 5e4+5;
inline int read() {
char c=getchar(); int x=0,f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
} int n, Q, p, c, a[N], op, l, r, phi[100], m, mo;
int Phi(int n) {
int m = sqrt(n), ans = n;
for(int i=2; i<=m; i++) if(n % i == 0) {
ans = ans / i * (i-1);
while(n % i == 0) n /= i;
}
if(n > 1) ans = ans / n * (n-1);
return ans;
}
int Pow(ll a, int b, ll mo, bool &flag) {
ll ans = 1;
bool big = 0;
for(; b; b>>=1) {
if(b&1) {
ans = ans * a;
flag |= big | (ans >= mo);
ans %= mo;
}
a = a * a; if(a >= mo) big = 1, a %= mo;
}
return ans;
} int cal(int x, int ci) {
if(x >= phi[ci]) x = x % phi[ci] + phi[ci];// flag = 1;
for(int i=ci-1; i>=0; i--) {
bool flag = 0;
x = Pow(c, x, phi[i], flag);
if(flag) x += phi[i];
}
return x % phi[0];
} namespace S {
struct meow{int sum, ci;} t[N<<2];
void merge(int x) {
t[x].sum = (t[lc].sum + t[rc].sum) %mo;
t[x].ci = min(t[lc].ci, t[rc].ci);
}
void build(int x, int l, int r) {
if(l == r) t[x].sum = a[l];
else {
build(lson);
build(rson);
merge(x);
}
}
void cat(int x, int l, int r, int ql, int qr) {
if(t[x].ci >= m) return;
if(l == r) t[x].ci++, t[x].sum = cal(a[l], t[x].ci);
else {
if(ql <= mid) cat(lson, ql, qr);
if(mid < qr) cat(rson, ql, qr);
merge(x);
}
}
int que(int x, int l, int r, int ql, int qr) {
if(ql<=l && r<=qr) return t[x].sum;
else {
int ans = 0;
if(ql <= mid) ans = (ans + que(lson, ql, qr)) %mo;
if(mid < qr) ans = (ans + que(rson, ql, qr)) %mo;
return ans;
}
}
} int main() {
freopen("in", "r", stdin);
n=read(); Q=read(); p=read(); c=read();
for(int i=1; i<=n; i++) a[i] = read();
mo = phi[0] = p;
while(p != 1) phi[++m] = p = Phi(p);
phi[++m] = 1;
S::build(1, 1, n);
for(int i=1; i<=Q; i++) {
op=read(); l=read(); r=read();
if(!op) S::cat(1, 1, n, l, r);
else printf("%d\n", S::que(1, 1, n, l, r));
}
}

bzoj 4869: [Shoi2017]相逢是问候 [扩展欧拉定理 线段树]的更多相关文章

  1. BZOJ:4869: [Shoi2017]相逢是问候

    4869: [Shoi2017]相逢是问候 先说点正经的…… 显然做了有限次(我只知道是有限次,而且不会大,别人说是log次?)修改以后会达到不动点,即以后怎么修改都不变了. 然后就随便做了.(3个l ...

  2. 【bzoj4869】[Shoi2017]相逢是问候 扩展欧拉定理+并查集+树状数组

    题目描述 Informatik verbindet dich und mich. 信息将你我连结. B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以分为两种:0 ...

  3. BZOJ4869 [Shoi2017]相逢是问候 【扩展欧拉定理 + 线段树】

    题目链接 BZOJ4869 题解 这题调得我怀疑人生,,结果就是因为某些地方\(sb\)地忘了取模 前置题目:BZOJ3884 扩展欧拉定理: \[c^a \equiv c^{a \mod \varp ...

  4. SHOI 2017 相逢是问候(扩展欧拉定理+线段树)

    题意 https://loj.ac/problem/2142 思路 一个数如果要作为指数,那么它不能直接对模数取模,这是常识: 诸如 \(c^{c^{c^{c..}}}\) 的函数递增飞快,不是高精度 ...

  5. BZOJ.3307.雨天的尾巴(dsu on tree/线段树合并)

    BZOJ 洛谷 \(dsu\ on\ tree\).(线段树合并的做法也挺显然不写了) 如果没写过\(dsu\)可以看这里. 对修改操作做一下差分放到对应点上,就成了求每个点子树内出现次数最多的颜色, ...

  6. 【bzoj4869】[Shoi2017]相逢是问候 线段树+扩展欧拉定理

    Description Informatikverbindetdichundmich. 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两 ...

  7. BZOJ4869:[SHOI2017]相逢是问候——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=4869 题面复制于洛谷:https://www.luogu.org/problemnew/show/P ...

  8. P3747 相逢是问候 欧拉定理+线段树

    巨难!!! 去年六省联考唯一的一道黑牌题,我今天一天从早到晚,把它从暴力15分怼到了90分,极端接近正解了. bzoj上A了,但是洛谷和loj上面就不行.伪正解会T,奇奇怪怪的类正解会WA.. 那么, ...

  9. [LNOI] 相逢是问候 || 扩展欧拉函数+线段树

    原题为2017六省联考的D1T3 给出一个序列,m次操作,模数p和参数c 操作分为两种: 1.将[l,r]区间内的每个数x变为\(c^x\) 2.求[l,r]区间内数的和%p 首先,我们要了解一些数论 ...

随机推荐

  1. 安装Ruby、Sass与Compass

    sass基于Ruby语言开发而成,因此安装sass前需要安装Ruby.(注:mac下自带Ruby无需在安装Ruby!) window下安装SASS首先需要安装Ruby,先从官网下载Ruby并安装.安装 ...

  2. Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗?

    8:08:01 青春阳光 2017/4/7 8:08:01 大神在吗? Tp框架查询分页显示与全部查询出来显示运行时间快慢有区别吗? 青春阳光 2017/4/7 8:08:20 还有个问题,上传到pu ...

  3. dede织梦怎么修改description的字数

    织梦在调用描述的时候都会使用description来调用描述,想要更改字数也可以控制调用的字数,但是就算是这样更改也是有字数限制的,描述的字数是不能没有限制. 在模板中调用描述的标签一般有四种: 1: ...

  4. 基于Redis的分布式锁的简单实现

    Redis官方给出两种思路 第一种:SET key value [EX seconds] [PX milliseconds] NX 第二种:SETNX+GETSET 首先,分别看一下这几个命令 SET ...

  5. 今天遇到了一个Spring出现的一个未知错误,分享下

    异常内容: 未知错误[COM999] 使用环境:dubbo+SpringMVC+myBatis 解决方案:检查Spring配置文件,发现配置文件在注入Service的时候写错了 com.wu.wsf. ...

  6. python3 第五章 - 什么是变量、运算符、表达式

    在读这一章时,运算符的内容比较多,不要去死记.现在记不住也没有关系,现在只要有这个印象.在后面的学习中,会慢慢加深理解,在理解中去记就容易得多了 1.变量 什么是变量?通俗的讲,就是存储在内存中可以变 ...

  7. python_py2和py3读写文本区别

    python2和python3的区别? python 2  str             对应      python3 bytes python 2 uincode            对应   ...

  8. x64内核HOOK技术之拦截进程.拦截线程.拦截模块

    x64内核HOOK技术之拦截进程.拦截线程.拦截模块 一丶为什么讲解HOOK技术. 在32系统下, 例如我们要HOOK SSDT表,那么直接讲CR0的内存保护属性去掉. 直接讲表的地址修改即可. 但是 ...

  9. mybatis自动生成java代码

    SSM框架没有DB+Record模式,写起来特别费劲,只能用下面的方法勉强凑合. 上图中,*.jar为下载的,src为新建的空白目录,.xml配置如下. <?xml version=" ...

  10. sp_getAppLock使用

    sp_getAppLock  获取程序资源锁,简单的说就是调用此函数可以达到我们程序中.NET的lock锁的作用. 作用域是当前数据库下 四个参数: @resource(必填):资源名称,类型nvar ...