BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)
由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值。线段树维护区间剩余修改次数的最大值,暴力修改即可。
可以预处理出每个位置进行k次操作后的值。直接计算是log^3的,会被卡常。考虑类似bsgs的分块,将指数拆成<10000和10000m两部分,预处理后即可O(1)查询,避免每次快速幂。
注意当指数<φ(p)不能加φ(p)。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 50010
int n,m,p,c,phi[],a[N][][],p1[][],p2[][],t;
bool flag[N][][],flag1[][],flag2[][],f;
int L[N<<],R[N<<],cnt[N<<],sum[N<<];
int ksm(int k,int p)
{
int x=k/,y=k%;
f=flag2[x][p]||flag1[y][p]||1ll*p2[x][p]*p1[y][p]>=phi[p];
return 1ll*p2[x][p]*p1[y][p]%phi[p];
}
void up(int k)
{
cnt[k]=min(cnt[k<<],cnt[k<<|]);
sum[k]=(sum[k<<]+sum[k<<|])%phi[];
}
void build(int k,int l,int r)
{
L[k]=l,R[k]=r;
if (l==r) {cnt[k]=,sum[k]=a[l][][];return;}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
up(k);
}
void modify(int k,int l,int r)
{
if (cnt[k]==t) return;
if (L[k]==R[k]) {cnt[k]++,sum[k]=a[l][cnt[k]][];return;}
int mid=L[k]+R[k]>>;
if (r<=mid) modify(k<<,l,r);
else if (l>mid) modify(k<<|,l,r);
else modify(k<<,l,mid),modify(k<<|,mid+,r);
up(k);
}
int query(int k,int l,int r)
{
if (L[k]==l&&R[k]==r) return sum[k];
int mid=L[k]+R[k]>>;
if (r<=mid) return query(k<<,l,r);
else if (l>mid) return query(k<<|,l,r);
else return (query(k<<,l,mid)+query(k<<|,mid+,r))%phi[];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj4869.in","r",stdin);
freopen("bzoj4869.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read(),p=read(),c=read();
phi[]=p;
while (p>)
{
phi[++t]=;
for (int i=;i*i<=p;i++)
if (p%i==)
{
phi[t]*=i-;p/=i;
while (p%i==) phi[t]*=i,p/=i;
}
if (p>) phi[t]*=p-;
p=phi[t];
}
phi[++t]=;
for (int i=;i<=t;i++)
{
p1[][i]=%phi[i],flag1[][i]=>=phi[i];
for (int j=;j<=;j++) flag1[j][i]=flag1[j-][i]||1ll*p1[j-][i]*c>=phi[i],p1[j][i]=1ll*p1[j-][i]*c%phi[i];
p2[][i]=%phi[i],flag1[][i]=>=phi[i];
for (int j=;j<=;j++) flag2[j][i]=flag2[j-][i]||1ll*p2[j-][i]*p1[][i]>=phi[i],p2[j][i]=1ll*p2[j-][i]*p1[][i]%phi[i];
}
for (int i=;i<=n;i++)
{
a[i][][]=read();for (int j=;j<=t;j++) flag[i][][j]=a[i][][]>=phi[j],a[i][][j]=a[i][][]%phi[j];
for (int j=;j<=t;j++)
for (int k=;k<=t-j;k++)
{
f=;
a[i][j][k]=ksm(a[i][j-][k+]+flag[i][j-][k+]*phi[k+],k);
flag[i][j][k]=f|flag[i][j-][k+];
}
}
build(,,n);
while (m--)
{
int op=read(),l=read(),r=read();
if (op==) modify(,l,r);
else printf("%d\n",query(,l,r));
}
return ;
}
BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)的更多相关文章
- [BZOJ4869][六省联考2017]相逢是问候(线段树+扩展欧拉定理)
4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1313 Solved: 471[Submit][Stat ...
- bzoj千题计划271:bzoj4869: [六省联考2017]相逢是问候
http://www.lydsy.com/JudgeOnline/problem.php?id=4869 欧拉降幂+线段树,每个数最多降log次,模数就会降为1 #include<cmath&g ...
- 洛谷 P3747 [六省联考2017]相逢是问候 解题报告
P3747 [六省联考2017]相逢是问候 题目描述 \(\text {Informatik verbindet dich und mich.}\) 信息将你我连结. \(B\) 君希望以维护一个长度 ...
- 洛谷P3747 [六省联考2017]相逢是问候
传送门 题解 扩展欧拉定理. 线段树维护,已经全改到底了的节点就不管,不然暴力修改下去. //Achen #include<algorithm> #include<iostream& ...
- P3747 [六省联考2017]相逢是问候
题意 如果对一个数操作\(k\)次,那么这个数会变成\(c^{c^{...^{a_i}}}\),其中\(c\)有\(k\)个. 根据P4139 上帝与集合的正确用法这道题,我们可以知道一个数不断变为自 ...
- 【LuoguP3747】[六省联考2017] 相逢是问候
题目链接 题意 给定一个长度为 n 的序列 a , 给定一个正整数 c 每次修改操作是把一段区间内的数 \(x_i\) 修改为 \(c^{x_i}\) 询问区间和模 p 的结果 Sol 修改是把一个数 ...
- 2017 [六省联考] T2 相逢是问候
4869: [Shoi2017]相逢是问候 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1205 Solved: 409[Submit][Stat ...
- 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)
[BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...
- 【BZOJ4868】[六省联考2017]期末考试(贪心)
[BZOJ4868][六省联考2017]期末考试(贪心) 题面 BZOJ 洛谷 题解 显然最终的答案之和最后一个公布成绩的课程相关. 枚举最后一天的日期,那么维护一下前面有多少天可以向后移,后面总共需 ...
随机推荐
- Spring的定时任务(任务调度)<task:scheduled-tasks>
Spring内部有一个task是Spring自带的一个设定时间自动任务调度,提供了两种方式进行配置,一种是注解的方式,而另外一种就是XML配置方式了.注解方式比较简洁,XML配置方式相对而言有些繁琐, ...
- .net MVC 图片水印,半透明
filter:alpha(opacity=50):这个是为IE6设的,可取值在0-100,其它三个0到1.-moz-opacity:0.5; 这个是为了支持一些老版本的Mozilla浏览器.-khtm ...
- ACID、数据库隔离级别
ACID: A(Atomicity):原子性,要么全部执行,要么都不执行 C(consistency):一致性: 特点: 1.一个操作除法级联,这些必须成功,否则全部失败(原子性) 2.所有节点同步更 ...
- jmeter "you cannot switch bacause data cannot be converted to target Tab data,empty data to switch"报错
jmeter "you cannot switch bacause data cannot be converted to target Tab data,empty data to swi ...
- 用python读取配置文件config.ini
还在学习中...写的有点凌乱 感觉还是应该先学会读取配置文件才行,把一些经常需要修改的但是又经常需要用到的参数放到配置文件中方便使用(我是这么觉得的) 首先是config.ini的存放位置,我们把它放 ...
- katalon系列三:Project Setting-项目设置
安装完katalon后,用QQ邮箱注册并登陆,然后新建一个项目.点击菜单Project-Project Setting打开项目设置,接下来介绍几个你可能会用到的设置. 1.Text Design-We ...
- Dreamweaver CS5网页制作教程
说到Dreamweaver这个网页制作神器,不由得想起在学校里上的选修课,那是的我们只知道 table 布局,只知道构建网站最方便的是使用“所见即所得”编辑器.回忆一下,真的是很怀旧啊! 虽说咱现在大 ...
- 最小生成树与Prim算法
最小生成树(MST) 定义 首先是一棵树(废话 其次没有回路(废话 包含全部顶点和V-1条边 边的权重和最小!!!!! 所以如果是单棵最小生成树,至少说明图是连通的.不然就是森林. 生成思路 既然是根 ...
- 一:yarn 介绍
yarn的了出现主要是为了拆分jobtracker的两个核心功能:资源管理和任务监控,分别对应resouceManager(RM)和applicationManager(AM).yarn中的任 ...
- JavaScript闭包总结
闭包是你家庭中的第三者你在享受着第三者给你带来的便利时,而你的家庭也随时触发前所未有的危机(直男癌患者的观点);闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见的方式,就是在一个函数内部 ...