bzoj 4869: [Shoi2017]相逢是问候 [扩展欧拉定理 线段树]
4869: [Shoi2017]相逢是问候
题意:一个序列,支持区间\(a_i \leftarrow c^{a_i}\),区间求和。在模p意义下。
类似于开根操作,每次取phi在log次后就不变了。
不互质怎么办? 我才知道,
\]
不要求互质,只要求\(x \ge \varphi(p)\)
然后就很好做了...线段树维护每个点的操作次数和和,修改的时候每个点算一下,不变的区间不再更新。
有一个问题,必须把\(\varphi(1)=1\)也加进去。我想了好久好久...因为
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]相逢是问候 [扩展欧拉定理 线段树]的更多相关文章
- BZOJ:4869: [Shoi2017]相逢是问候
4869: [Shoi2017]相逢是问候 先说点正经的…… 显然做了有限次(我只知道是有限次,而且不会大,别人说是log次?)修改以后会达到不动点,即以后怎么修改都不变了. 然后就随便做了.(3个l ...
- 【bzoj4869】[Shoi2017]相逢是问候 扩展欧拉定理+并查集+树状数组
题目描述 Informatik verbindet dich und mich. 信息将你我连结. B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以分为两种:0 ...
- BZOJ4869 [Shoi2017]相逢是问候 【扩展欧拉定理 + 线段树】
题目链接 BZOJ4869 题解 这题调得我怀疑人生,,结果就是因为某些地方\(sb\)地忘了取模 前置题目:BZOJ3884 扩展欧拉定理: \[c^a \equiv c^{a \mod \varp ...
- SHOI 2017 相逢是问候(扩展欧拉定理+线段树)
题意 https://loj.ac/problem/2142 思路 一个数如果要作为指数,那么它不能直接对模数取模,这是常识: 诸如 \(c^{c^{c^{c..}}}\) 的函数递增飞快,不是高精度 ...
- BZOJ.3307.雨天的尾巴(dsu on tree/线段树合并)
BZOJ 洛谷 \(dsu\ on\ tree\).(线段树合并的做法也挺显然不写了) 如果没写过\(dsu\)可以看这里. 对修改操作做一下差分放到对应点上,就成了求每个点子树内出现次数最多的颜色, ...
- 【bzoj4869】[Shoi2017]相逢是问候 线段树+扩展欧拉定理
Description Informatikverbindetdichundmich. 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两 ...
- BZOJ4869:[SHOI2017]相逢是问候——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=4869 题面复制于洛谷:https://www.luogu.org/problemnew/show/P ...
- P3747 相逢是问候 欧拉定理+线段树
巨难!!! 去年六省联考唯一的一道黑牌题,我今天一天从早到晚,把它从暴力15分怼到了90分,极端接近正解了. bzoj上A了,但是洛谷和loj上面就不行.伪正解会T,奇奇怪怪的类正解会WA.. 那么, ...
- [LNOI] 相逢是问候 || 扩展欧拉函数+线段树
原题为2017六省联考的D1T3 给出一个序列,m次操作,模数p和参数c 操作分为两种: 1.将[l,r]区间内的每个数x变为\(c^x\) 2.求[l,r]区间内数的和%p 首先,我们要了解一些数论 ...
随机推荐
- 浅谈MySQL集群高可用架构
前言 高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能 ...
- DEDECMS首页调用图片集里的多张图片
本文给大家分享的是织梦系统中首页调用图片集里的多张图片的方法,有相同需要的小伙伴可以参考下. 先找到include/common.inc.php文件,把下面代码贴进去(我贴的是我网站上的,具体可根据需 ...
- PHP 正则表达式匹配函数 preg_match 与 preg_match_all
preg_match() preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 . 语法: 1 int preg_match( string pattern, strin ...
- LNMP环境的搭建
http://blog.csdn.net/wzy_1988/article/details/8438355#
- 读书笔记之《Java编程思想》
17. 容器 Set 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素. Set接口不保证维护元素的次序 Map 映射表(关联数组)的基本思想是维护的是键-值(对)关联,因此可以用键来查找 ...
- designed principle
Review Of designed Pattern principle OutLine: Explanation in principles of designed pattern and usef ...
- 美国不同C段服务器,多ip服务器
作为多IP服务器的拓展,多C段服务器,例如:IP分为4段,A段,B段,C段,D段.192.168.0.1/24代表着一个C段,可用IP段为192.168.0.1-255,一个C段有253个可用IP.一 ...
- mysql-innoDB-多版本并发控制(MVCC)
InnoDB的MVCC,是通过在每行记录后面保存三个隐藏的列来实现的其中的两个列一个保存了行的创建时间,一个保存行的过期时间(或删除时间).当然存储的并不是实际的时间值,而是系统版本号(system ...
- crontab执行带参数的php脚本,并取得参数[转]
现在越来越喜欢用linux了,程序当中也去掉了很多触发性判断,改用了借用linux的crontab的特性来进行,这样程序效率确实是高了很多. 比如我们每月1号清空月点击,比如每天凌晨统计上一天的访问报 ...
- phpExcel导出excel加超级链接的实例代码[转]
phpexcel实现的导出excel文件的代码,且可以在excel文件中加入超级链接. 说明:PHPExcel的开发包Tests目录有详细使用实例.以下代码支持中文,注意文件编码,文件保存为utf-8 ...