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. hdu_1015(dfs)

    题意:根据给出的计算公式,给一个n和一个字符集,问能不能在字符串集中找到不重复的五个字符,让其计算结果等于给定的n,如果有多个解输出字典序最大的一个 题解:dfs直接上代码了 code: #inclu ...

  2. HDU--1213并查集

    题目传送门:HDU--1213 //题意:ignatius过生日,客人来到,他想知道他需要准备多少张桌子.然而一张桌子上面只能坐上相互熟悉的人, //其中熟悉可定义成为A与B认识,B与C认识,我们就说 ...

  3. 关于JAVA实现二维码以及添加二维码LOGO

    今天在公司,完成了之前的任务,没有什么事做,就想鼓捣一下二维码,因为之前没有接触过,我就去翻看了几本书,也基本完成了二维码的实现,以及添加二维码的LOGO. 现在绘制二维码一般都使用的是谷歌的zxin ...

  4. JFinal极速开发框架使用笔记(三) 分析Model和ActiveRecord

    JFinal框架的一些新发现的用法: 在JFinal框架中,实体类并不需要设置属性,更不需要配置getset方法就可以很方便的操作数据库,如果需要设置或者获取属性,可以直接使用一下方式: User u ...

  5. window下部署Solr

    主要步骤如下: 1.下载solr-4.7.2.zip;下载地址:http://archive.apache.org/dist/lucene/java/ 2.解压缩solr-4.7.2.zip,解压后目 ...

  6. 如何为图片添加热点链接?(map + area)

    所谓图片热点链接就是为图片指定一个或多个区域以实现点击跳转到指定的页面.简单来说就是点击某一区域就能跳转到相应的页面,而无需点击整个图片才能跳转. 说到图片热点链接,我首先想到了map + area, ...

  7. jQuery:图片自动变换

    <script type="text/javascript"> var aa=0; //设置变换时间为2s var timeChange=2000; //定义数组 va ...

  8. 【转载】keil5中加入STM32F10X_HD,USE_STDPERIPH_DRIVER的原因

    初学STM32,在RealView MDK 环境中使用STM32固件库建立工程时,初学者可能会遇到编译不通过的问题.出现如下警告或错误提示: warning: #223-D: function &qu ...

  9. git gui提交无法获知你的身份 20

    刚刚学习,请说的详细一些,谢谢 callct | 浏览 3382 次 我有更好的答案 1条回答 你没有定义你的名字和邮箱.你打开git console/shell, #输入下面两句,并且替换成你的名字 ...

  10. Access是什么?

    一种使用简单的数据库软件,非常实用! 是微软的一个小型数据库,是Microsoft office 中的一个组件. Access数据库能够进行数据表设计.可视查询设计.SQL查询语言.窗体设计.报表设计 ...