luogu P3747 [六省联考2017]相逢是问候
时间:2020-05-18
本文章向大家介绍luogu P3747 [六省联考2017]相逢是问候 ,主要包括luogu P3747 [六省联考2017]相逢是问候 使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
可以先考虑对一个位置修改,如果修改了\(k\)次,那权值就是\(c^{c^{\cdots^{c^{a_i}}}}\bmod {p}\),其中里面有\(k\)个\(c\),这里不妨设为\(f_{i,k}\).根据拓展欧拉定理,可得\(f_{i,k}=c^{f_{i,k-1} \% \varphi(p)+[f_{i,k-1}\ge \varphi(p)]*\varphi(p)}\% p\),然后\(f_{i,k-1}\)就可以递归求.可以发现对于一个\(p\),求大约\(O(\log p)\)次\(\varphi\)就会变成\(1\),所以对于一个位置修改若干次后他的值就会确定下来
现在考虑区间修改,我们维护区间修改次数的最小值,如果被修改区间的修改次数的最小值还没到对应阈值就暴力递归到叶子更新,由于每个位置只会更新\(O(\log n )\)次,所以花在暴力递归上的复杂度为\(O(n\log^2n)\)
这里的复杂度瓶颈在于每个位置的求值,每次的复杂度为两个log(递归+每次要快速幂),所以考虑预处理模数为每一种可能的模数的幂数组,例如\(c^i\bmod p_j,c^{10000i}\bmod p_j\),就可以做到线性了
//下面是瞎写的
#include<bits/stdc++.h>
#define LL long long
#define db double
using namespace std;
const int N=50000+10;
const LL gg=1e9;
int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+(ch^48);ch=getchar();}
return x*w;
}
int n,q,p,c,a[N],va[N][110],pp[110],pz[110][N],an[110][N],t;
int s[N<<3],mi[N<<3];
void psup(int o){s[o]=(s[o<<1]+s[o<<1|1])%p,mi[o]=min(mi[o<<1],mi[o<<1|1]);}
int fpow(int a,int b,int ii)
{
int mod=pp[ii];
if(mod<=N/2&&b<N) return an[ii][b];
int na=1;
for(int i=0;b;++i)
{
if(b&1) na=1ll*na*pz[ii][i]%mod;
b>>=1;
}
return na;
}
int pw(LL a,LL b)
{
if(b==gg) return b;
if(a==1||!b) return 1;
LL an=1;
while(b){if(b&1) an=min(an*a,gg);a=min(a*a,gg),b>>=1;}
return an;
}
int cal(int x,int y)
{
int an=x%pp[y],zk=x;
for(int i=y-1;~i;--i)
{
int nb=an+(zk>=pp[i+1]?pp[i+1]:0);
zk=pw(c,zk),an=fpow(c,nb,i);
}
return an;
}
void modif(int o,int l,int r,int ll,int rr)
{
if(mi[o]>=t) return;
if(l==r){++mi[o],s[o]=va[l][mi[o]];return;}
int mid=(l+r)>>1;
if(ll<=mid) modif(o<<1,l,mid,ll,rr);
if(rr>mid) modif(o<<1|1,mid+1,r,ll,rr);
psup(o);
}
int quer(int o,int l,int r,int ll,int rr)
{
if(ll<=l&&r<=rr) return s[o];
int an=0,mid=(l+r)>>1;
if(ll<=mid) an=(an+quer(o<<1,l,mid,ll,rr))%p;
if(rr>mid) an=(an+quer(o<<1|1,mid+1,r,ll,rr))%p;
return an;
}
void bui(int o,int l,int r)
{
if(l==r){s[o]=a[l]%p,mi[o]=0;return;}
int mid=(l+r)>>1;
bui(o<<1,l,mid),bui(o<<1|1,mid+1,r);
psup(o);
}
int main()
{
n=rd(),q=rd(),p=rd(),c=rd();
pp[t=0]=p;
while(pp[t]>1)
{
pp[++t]=1;
int x=pp[t-1],sqt=sqrt(x);
for(int j=2;j<=sqt;++j)
if(x%j==0)
{
pp[t]*=j-1,x/=j;
while(x%j==0) pp[t]*=j,x/=j;
}
if(x>1) pp[t]*=x-1;
}
pp[++t]=1;
for(int i=0;i<=t;++i)
{
if(pp[i]<=N/2)
{
an[i][0]=1%pp[i];
for(int j=1;j<N;++j) an[i][j]=1ll*an[i][j-1]*c%pp[i];
}
else
{
pz[i][0]=c%pp[i];
for(int j=1;j<40;++j) pz[i][j]=1ll*pz[i][j-1]*pz[i][j-1]%pp[i];
}
}
for(int i=1;i<=n;++i) a[i]=rd();
for(int j=0;j<=t;++j)
for(int i=1;i<=n;++i)
va[i][j]=cal(a[i],j);
bui(1,1,n);
while(q--)
{
int op=rd(),l=rd(),r=rd();
if(!op) modif(1,1,n,l,r);
else printf("%d\n",quer(1,1,n,l,r));
}
return 0;
}
原文地址:https://www.cnblogs.com/smyjr/p/12912750.html
- 微软官方提供的用于监控MS SQL Server运行状况的工具及SQL语句
- 生成人工智能:创意专家新的强大工具
- JavaScript能做什么?
- SQL中利用DMV进行数据库性能分析
- 完整部署CentOS7.2+OpenStack+kvm 云平台环境(1)--基础环境搭建
- 独家!万达网科大裁员后将转型AI 朱战备或接班曲德君
- Git分支管理的策略梳理
- 数据场景分析 线上线下商家到底谁能干过谁?
- 张钦坤:云计算、开放平台与服务商版权责任
- biztalk 2010 dev版安装小记
- 微信小程序如何获取组件实际高度
- flex4/flash builder中动态加载Module并与之交互的正确方式
- Google发布会看图的人工智能,让它来评评你的照片拍得好不好
- Git日常操作命令梳理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Web自动化必会「Web基础、元素定位、元素操作、Selenium运行原理、项目实战+框架」
- HTML5 meta viewport参数详解
- 二分查找应该都会,那么二分查找的变体呢?
- TypeScript 实战算法系列(三):实现链表与变相链表
- JavaScript 测试系列实战(一):使用 Jest 和 Enzyme 测试 React 组件
- TypeScript 实战算法系列(二):实现队列与双端队列
- VBA位操作
- VBA编写Ribbon Custom UI编辑器07——写入xml
- Linux下在文件夹所有文件中查找相关内容
- archlinux安装篇(一) 基本系统
- git使用要点
- 七夕 - 程序员表白代码
- Shell流程控制
- Shell sed命令
- focus/focusin/focusout