P3747 [六省联考2017]相逢是问候
题意
如果对一个数操作\(k\)次,那么这个数会变成\(c^{c^{...^{a_i}}}\),其中\(c\)有\(k\)个。
根据P4139 上帝与集合的正确用法这道题,我们可以知道一个数不断变为自己的欧拉函数,大约\(log\)次就会变成1,而任何数模\(1\)都是\(0\),于是我们可以用势能线段树解决。
因为模数不变,因此我们可以预处理所有\(\varphi(\varphi(...\varphi(p)...))\),之后在线段树上记录操作次数。
这样是三个\(log\)的,因为还要快速幂,可以对每个\(\varphi(\varphi(...\varphi(p)...))\)预处理,用光速幂解决。
注意,扩展中国剩余定理\(a_k\equiv a^{k\%\varphi(p)+\varphi(p)}\pmod{p}\)适用当且仅当\(k\geqslant \varphi(p)\),因此我们在求值时用一个\(flag\)表示是否要\(+\varphi(p)\)。
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls(p) (p<<1)
#define rs(p) (p<<1|1)
const int maxn=50010;
const int maxt=10010;
int n,m,mod,C,maxtim;
int a[maxn];
int pw1[60][maxt],pw2[60][maxt];
bool flag;
bool flag1[60][maxt],flag2[60][maxt];
vector<int>ve;
struct Seg
{
#define sum(p) (seg[p].sum)
#define cnt(p) (seg[p].cnt)
int sum,cnt;
}seg[maxn<<2];
inline int read()
{
char c=getchar();int res=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
return res*f;
}
inline int phi(int x)
{
int res=x,tmp=x;
for(int i=2;i*i<=tmp;i++)
{
if(tmp%i)continue;
res=res/i*(i-1);
while(tmp%i==0)tmp/=i;
}
if(tmp>1)res=res/tmp*(tmp-1);
return res;
}
inline void pre_work()
{
int tmp=mod;
ve.push_back(mod);
while(tmp>1)tmp=phi(tmp),ve.push_back(tmp);
ve.push_back(1);
for(unsigned int i=0;i<ve.size();i++)
{
pw1[i][0]=1;
for(int j=1;j<=10000;j++)
{
pw1[i][j]=pw1[i][j-1]*C;
if(pw1[i][j]>=ve[i])pw1[i][j]%=ve[i],flag1[i][j]=1;
flag1[i][j]|=flag1[i][j-1];
}
}
for(unsigned int i=0;i<ve.size();i++)
{
pw2[i][0]=1;flag2[i][1]=flag1[i][10000];
for(int j=1;j<=10000;j++)
{
pw2[i][j]=pw2[i][j-1]*pw1[i][10000];
if(pw2[i][j]>=ve[i])pw2[i][j]%=ve[i],flag2[i][j]=1;
flag2[i][j]|=flag2[i][j-1];
}
}
}
inline void up(int p)
{
sum(p)=(sum(ls(p))+sum(rs(p)))%mod;
cnt(p)=min(cnt(ls(p)),cnt(rs(p)));
}
void build(int p,int l,int r)
{
if(l==r){sum(p)=a[l];return;}
int mid=(l+r)>>1;
build(ls(p),l,mid);build(rs(p),mid+1,r);
up(p);
}
inline int power(int x,int id)
{
flag=0;
int res=pw1[id][x%10000]*pw2[id][x/10000];
if(res>=ve[id])res%=ve[id],flag=1;
flag|=flag1[id][x%10000]|flag2[id][x/10000];
return res;
}
int calc(int x,int dep,int k)
{
flag=0;
if(dep==k)
{
if(x>=ve[dep])flag=1,x%=ve[dep];
return x;
}
int tmp=calc(x,dep+1,k);
return power(flag?tmp+ve[dep+1]:tmp,dep);
}
void change(int p,int l,int r,int ql,int qr)
{
if(cnt(p)>=(int)ve.size()-1)return;
if(l==r)
{
cnt(p)++;
sum(p)=calc(a[l],0,cnt(p));
return;
}
int mid=(l+r)>>1;
if(ql<=mid)change(ls(p),l,mid,ql,qr);
if(qr>mid)change(rs(p),mid+1,r,ql,qr);
up(p);
}
int query(int p,int l,int r,int ql,int qr)
{
if(l>=ql&&r<=qr)return sum(p);
int mid=(l+r)>>1,res=0;
if(ql<=mid)res=(res+query(ls(p),l,mid,ql,qr))%mod;
if(qr>mid)res=(res+query(rs(p),mid+1,r,ql,qr))%mod;
return res;
}
signed main()
{
//freopen("test.in","r",stdin);
//freopen("test.out","w",stdout);
n=read();m=read();mod=read();C=read();
for(int i=1;i<=n;i++)a[i]=read();
build(1,1,n);
pre_work();
for(int i=1;i<=m;i++)
{
int op=read(),l=read(),r=read();
if(!op)change(1,1,n,l,r);
else printf("%lld\n",query(1,1,n,l,r));
}
return 0;
}
P3747 [六省联考2017]相逢是问候的更多相关文章
- 洛谷 P3747 [六省联考2017]相逢是问候 解题报告
P3747 [六省联考2017]相逢是问候 题目描述 \(\text {Informatik verbindet dich und mich.}\) 信息将你我连结. \(B\) 君希望以维护一个长度 ...
- 洛谷P3747 [六省联考2017]相逢是问候
传送门 题解 扩展欧拉定理. 线段树维护,已经全改到底了的节点就不管,不然暴力修改下去. //Achen #include<algorithm> #include<iostream& ...
- [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 ...
- BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)
由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值.线段树维护区间剩余 ...
- 【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 洛谷 题解 显然最终的答案之和最后一个公布成绩的课程相关. 枚举最后一天的日期,那么维护一下前面有多少天可以向后移,后面总共需 ...
随机推荐
- cs5642-v3各配置文件测试图片对比
寄存器功能强大,可以配置很多参数,每个参数出来的图像都不同 我们以cs5642-v3的两个配置进行了对比测试 测试准备 配置文件:ov5642_960p_RAW和OV5642_YUV_VGA 测试摄像 ...
- ansible部署apache
Ansible 配置Apache(加粗的字体是要执行的命令) 配置免密登录 [root@localhost ansible]# vim /etc/ansible/hosts //用来配置目标主机 加入 ...
- 《Java基础知识》Java 泛型详解
JDK 1.5 之后,Java 通过泛型解决了容器类型安全这一问题,而几乎所有人接触泛型也是通过Java的容器.那么泛型究竟是什么? 泛型的本质是参数化类型:也就是说,泛型就是将所操作的数据类型作为参 ...
- JS 正则表达式^$详解,脱字符^与美元符$同时写表示什么意思?
壹 ❀ 引 对于初学正则的同学来说,^$这两个看似简单的字符却在使用中总让匹配结果超出我们的预期,^什么时候表示行首什么时候表示反义?^ $两个一起写表示什么含义?今天我们就来详细聊聊这两个字符. ...
- Ajax之调用一言网站API接口
Ajax的作用,主要是实现局部刷新. 通过老大哥告知,Ajax接口可以使用一言网站的,所以自己就练了一下子. 本文所有用到的接口都来自一言网站:https://hitokoto.cn/api 通过网站 ...
- 设计模式之单例模式C#实现
前言 单例模式是老生常谈的一种设计模式,同时它是最简单也是最容易被忽视的一种设计模式. 下面是一些个人看法: (1) 单例类需要保证自己的唯一性,同时也需要避免被继承,即需要使用sealed修饰: ( ...
- System.InvalidOperationException: The binary operator NotEqual is not defined for the types 'Microsoft.EntityFrameworkCore.Storage.ValueBuffer' and 'Microsoft.EntityFrameworkCore.Storage.ValueBuffer'.
.netcore 2.1使用左表连接时报错,原因是对数据库中实体 DateTimeOffset date做查询判断时,将数据库中date转为string进行了判断,这样判断是错误的,并且效率低,应该是 ...
- JS---案例:点击按钮设置div背景色渐变
案例:点击按钮设置div背景色渐变 背景色渐变:设置透明度 <div id="dv"></div> <input type="button& ...
- 如何在阿里云服务器上搭建wordpress个人网站
1.购买云服务器.域名.域名解析.配置linux系统上的web环境.FTP等参照下面的链接. https://www.cnblogs.com/smyhvae/p/4965163.html?tdsour ...
- C语言程序设计100例之(25):确定进制
例25 确定进制 问题描述 6*9 = 42 对于十进制来说是错误的,但是对于13进制来说是正确的.即 6(13)* 9(13)= 42(13),因为,在十三进制中,42 = 4 * 13 + ...