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. python基础1 day2

    一.上节课回顾1. 编译型: 将源码一次性全部编译成二进制. C 优点:执行效率高. 缺点:开发效率慢,不可跨平台使用. 解释型: 当程序执行时,代码一行一行的去解释成二进制. python 优点:开 ...

  2. dede后台出现   保存目录数据时失败,请检查你的输入资料是否存在问题

    dede 5.7无法增加顶级/二级栏目,保存目录数据时失败,请检查你的输入资料是否存在问题!执行了SQL还是不行 解决档案:用正常可以添加栏目的,将E:\wamp\www\dededln\back(d ...

  3. dedecms_

    2012-7-5(no1)当我们点击检索结果的某个电影超链接时,如何跳转到对应的内容页[本资源由www.qinglongweb.com搜集整理] dedelist标签 --可以嵌套 项目移植: mys ...

  4. 数据库复习总结(17)-T-Sql编程

    T-SQL(SQL SERVER) 百度百科:(即 Transact-SQL,是 SQL 在 Microsoft SQL Server 上的增强版,它是用来让应用程序与 SQL Server 沟通的主 ...

  5. 导入Mybatis_Spring项目遇到的问题

    1.  问题: jdk版本不匹配  解决方法:首先 到项目空间的   .setting文件中找到  org.eclipse.wst.common.project.facet.core.xml  修改参 ...

  6. 要学的东西太多了,还想学习opencv

    资料先放这里,以后好好学 http://m.blog.csdn.net/column/details?alias=opencv-tutorial eclipse加载opencv库成功! B站视频教程资 ...

  7. navicat的简单使用

    navicat的简单使用: 连接: 输入ip地址,端口,用户名,密码 新建数据库: 数据库名,字符编码一定要选择utf-8 新建表: 字段,约束条件 双击表名,自己打开表,点击空列,添加数据,ctl+ ...

  8. scrapy_cookie禁用_延迟下载_自定义爬虫setting

    如何设置禁止cookie? 在setting中 添加字段: COOKIE_ENABLED = False                            # False关闭cookie,True ...

  9. linux相关概念

    最近这段时间玩Linux比较多,前面我也转载了好多的相关的Linux指令.这里自己关于Linux概念来自己整理一下. 首先我们应该知道Linux到底是什么? 我们知道Linux这玩意儿是在计算机上面运 ...

  10. maven插件本地化安装

    mvn install:install-file -Dfile="D:\maven\repository\com\tc\itfarm-api\1.0.0-SNAPSHOT\itfarm-ap ...