【SHOI2017】相逢是问候【扩展欧拉定理】【复杂度分析】【线段树】

题意:给定一个长度为 nnn 的序列 aia_iai,维护 mmm 次操作:

  1. 区间执行 ai←caia_i \leftarrow c^{a_i}aicai
  2. 区间求和 模 ppp

其中 p,cp,cp,c 对所有操作相同。

n,m≤5×104,p≤108n,m\leq 5\times 10^4,p\leq 10^8n,m5×104,p108

不建议写,真的浪费生命

根据扩展欧拉定理,显然修改 O(log⁡p)O(\log p)O(logp) 次就没用了,所有数总共只会修改 O(nlog⁡P)O(n\log P)O(nlogP) 次。

但是暴力的话循环是占复杂度的,我们需要快速判断某个区间是否还需要修改。

似乎就只能线段树了?

暴力预处理出每个数 φ60\varphi \text{ } 60φ 60 次内的结果,然后线段树维护区间修改次数最小值和当前的区间和。修改的时候如果当前区间最小修改次数达到 606060 就退出,否则暴力递归。

复杂度 O(nlog⁡2P)O(n\log^2 P)O(nlog2P) ,会被卡,根号预处理快速幂可以 O(nlog⁡P)O(n\log P)O(nlogP)

听上去还挺美好,然而这题最恶心的地方在判断扩展欧拉定理的适用条件……

方法是在快速幂(或预处理幂)的时候记录是否取过模。

Q:如何证明不会出现 x>φ(p),cx%φ(p)+φ(p)<px>\varphi (p),c^{x \%\varphi(p)+\varphi(p)}<px>φ(p),cx%φ(p)+φ(p)<p ,然后继续迭代的时候崩掉的情况?

A:实际上 cφ(p)≥pc^{\varphi(p)} \geq pcφ(p)p 一般都是对的。

考虑计算 φ(p)\varphi(p)φ(p) 的一个很松的下界:φ(p)\varphi(p)φ(p) 考虑了每个质因子 xxx ,然后 p←p×x−1xp\leftarrow p\times \dfrac {x-1}xpp×xx1

根据糖水原理,这个 xxx 越小效果会越明显。而 xxx 小的时候能得到的质因子也会更多。

10810^8108 以内的数最多只有 888 个质因子,所以可以估算一个下界 φ(p)p≥12×23×45×⋯×1819≈0.17\dfrac{\varphi(p)}{p}\geq\dfrac 12 \times \dfrac 23\times \dfrac 45\times \dots\times \dfrac {18}{19} \approx 0.17pφ(p)21×32×54××19180.17

相当于要证明: 2p/7≥p2^{p/7}\geq p2p/7p ,前者增长远快于后者,ppp 足够大(也就几十)的时候该式成立。

小数据暴力打表知只有个 p=6p=6p=6 ,但 666 只能取 222φ\varphiφ ,所以也崩不了

证毕

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#include <bitset>
#include <utility>
#define MAXN 50005
#define re register
using namespace std;
typedef long long ll;
int n,q,c,flag;
inline int mul(const int& a,const int& b,const int& MOD)
{ll c=(ll)a*b;if (c>=MOD) flag=1;return c%MOD;
}
int m[60],len;
typedef pair<int,int> pi;
const int N=2e4;
pi p1[60][N+5],p2[60][N+5];//i,i*10000
inline void init()
{for (int T=0;T<=len;T++){p1[T][0]=p2[T][0]=make_pair(1,0);flag=0;for (int i=1;i<N;i++) p1[T][i].first=mul(p1[T][i-1].first,c,m[T]),p1[T][i].second=flag;p2[T][1].first=mul(p1[T][N-1].first,c,m[T]),p2[T][1].second=flag;for (int i=2;i<=N;i++) p2[T][i].first=mul(p2[T][i-1].first,p2[T][1].first,m[T]),p2[T][i].second=flag;}
}
inline int qpow(int p,int i)
{pi x=p1[i][p%N],y=p2[i][p/N];flag|=(x.second|y.second);return mul(x.first,y.first,m[i]);
}
inline int calcphi(int x)
{int ans=1;for (int i=2;i*i<=x;i++)if (x%i==0){ans*=i-1,x/=i;while (x%i==0) ans*=i,x/=i;}if (x>1) ans*=x-1;return ans;
}
int a[MAXN][60];
#define lc p<<1
#define rc p<<1|1
int sum[MAXN<<2],mcnt[MAXN<<2];
inline void update(int p){mcnt[p]=min(mcnt[lc],mcnt[rc]),sum[p]=(sum[lc]+sum[rc])%m[0];}
void build(int p,int l,int r)
{if (l==r){scanf("%d",&a[l][0]);for (int i=1;i<=len;i++){flag=0;int x=a[l][0];for (int j=i;j>=1;j--) x=qpow(x+m[j]*flag,j-1);a[l][i]=x;}sum[p]=a[l][0];return;}int mid=(l+r)>>1;build(lc,l,mid);build(rc,mid+1,r);update(p);
}
void modify(int p,int l,int r,int ql,int qr)
{if (qr<l||r<ql) return;if (mcnt[p]>=len) return;if (l==r) return (void)(sum[p]=a[l][++mcnt[p]]);int mid=(l+r)>>1;modify(lc,l,mid,ql,qr),modify(rc,mid+1,r,ql,qr);update(p);
}
int query(int p,int l,int r,int ql,int qr)
{if (qr<l||r<ql) return 0;if (ql<=l&&r<=qr) return sum[p];int mid=(l+r)>>1;return (query(lc,l,mid,ql,qr)+query(rc,mid+1,r,ql,qr))%m[0];
}
int main()
{scanf("%d%d%d%d",&n,&q,&m[0],&c);for (len=1;(m[len]=calcphi(m[len-1]))>1;++len);m[++len]=1;init();build(1,1,n);while (q--){int t,l,r;scanf("%d%d%d",&t,&l,&r);if (t==0) modify(1,1,n,l,r);else printf("%d\n",query(1,1,n,l,r));}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

aspnetcore 实现简单的伪静态化

aspnetcore 实现简单的伪静态化Intro在我的活动室预约项目中&#xff0c;有一个公告模块&#xff0c;类似于新闻发布&#xff0c;个人感觉像新闻这种网页基本就是发布的时候编辑一次之后就再也不会改了&#xff0c;最适合静态化了&#xff0c; 静态化之后用户请求的就是静态文件…

#530. 「LibreOJ β Round #5」最小倍数 二分 + 数论

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 本来想刷数位dpdpdp&#xff0c;无意间碰到了这个题来水水。 我们知道n!n!n!中质因子ppp的个数为∑i1npi\sum_{i1} \frac{n}{p^i}∑i1​pin​&#xff0c;所以我们就可以二分nnn&#xff0…

斜堆学习笔记+复杂度证明

和左偏树几乎一模一样&#xff0c;唯一的区别是左偏树合并后判断如果左儿子深度小于右儿子则交换左右儿子&#xff0c;而斜堆直接无脑交换。 复杂度是均摊的 O(nlog⁡n)O(n\log n)O(nlogn) 证明&#xff1a; 定义重结点为右儿子大小大于左儿子的结点&#xff0c;否则为轻结点…

《ASP.NET Core 高性能系列》致敬伟大的.NET斗士甲骨文

写在开始三年前,曾写过一篇文章:从.NET和Java之争谈IT这个行业,当时遭到某些自认为懂得java就了不起的Javaer抨击,现在可以致敬伟大的.NET斗士甲骨文了  (JDK8以上都需要收费,Android弃用java作为第一语言,别高兴:OpenJDK是甲骨文的).《ASP.NET Core 高性能系列》是一套如何编…

【NOIP2017】逛公园【最短路DAG】【dp】【拓扑排序】

题意&#xff1a;给一张帯权有向图&#xff0c;求 111 到 nnn 长度不超过最短路长度 kkk 的路径条数 模 PPP。有无数条输出 −1-1−1 。 n≤105,m≤2105,k≤50n\leq 10^5,m\leq 2\times 10^5,k\leq 50n≤105,m≤2105,k≤50&#xff0c;边权非负 先往最短路图想 发现 kkk 很小…

Codeforces Round #599 (Div. 2) E. Sum Balance 图转换 + 子集dp + 环

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 首先我们知道如果所有数的和summodk!0sum\bmod k!0summodk!0那么此时无解&#xff0c;否则我们设needsum/kneedsum/kneedsum/k。 看到kkk这么小&#xff0c;自然的想到是否能状压&#xff…

资深开发者们是如何读书的?---线下读书会记录

读了多少书&#xff1f;怎么读书&#xff1f;——请问大家最近读书了吗&#xff1f;一年大概读了多少本书。有超过20本&#xff0c;超过30本&#xff0c;超过50本吗&#xff1f;在7月14日由长沙互联网活动基地和长沙.NET技术社区组织的小型社区活动&#xff0c;《开发者爱读书•…

【APIO2018】Duathlon 铁人两项 【圆方树】

题意&#xff1a;给一张 nnn 点 mmm 边的简单无向图&#xff0c;求有多少个三元组 (s,c,f)(s,c,f)(s,c,f) &#xff0c;满足存在一条从 sss 到 fff 经过 ccc 的简单路径。 n≤105,m≤2105n\leq 10^5,m\leq 2\times 10^5n≤105,m≤2105 首先这个 “经过 ccc 的简单路径” &…

Codeforces Round #598 (Div. 3) E. Yet Another Division Into Teams dp + 输出方案

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的序列aaa&#xff0c;你需要将其分成若干组&#xff0c;每组的价值为max⁡(ai)−min(ai)\max(a_i)-min(a_i)max(ai​)−min(ai​)&#xff0c;求如何分组才能使得代价最小&#xff0c;输出…

架构杂谈《三》

一致性问题前面的《架构杂谈一》和《架构杂谈二》 杂谈了从服务化到微服务架构的演进&#xff0c;并肯定了服务化和微服务架构是一脉相承的。微服务在服务化架构的基础上&#xff0c;对服务化的细节和方案进行了优化和细化&#xff0c;重点突出了无中心化管理的微服务架构&…

【SDOI2018】战略游戏【圆方树】【虚树】

题意&#xff1a;给一张 nnn 点 mmm 边的连通无向图&#xff0c;qqq 次询问&#xff0c;每次给出一个点集 SSS &#xff0c;求有多少个不在 SSS 中的点满足删除后 SSS 中存在两个点不连通。 n≤105,m≤2105,∑∣S∣≤2105n\leq 10^5,m\leq 2\times 10^5,\sum |S|\leq 2\times 1…

Codeforces Round #598 (Div. 3) F. Equalizing Two Strings 思维 + 逆序对

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个长度为nnn的串a,ba,ba,b&#xff0c;每次可以同时翻转a,ba,ba,b中任意一段长度为L(1≤L≤n)L(1\le L\le n)L(1≤L≤n)的子串&#xff0c;问能否通过若干次操作使两个串相同。 思路&#xff1a; 首…

腾讯发布 Tencent SCF Toolkit VS Code 插件,轻松开发无服务器云函数

在之前的文章中&#xff0c;我们提到了亚马逊、谷歌、IBM 等大厂都上了 Visual Studio Code 的船。阿里巴巴也在近日发布了 Aliyun Serverless VS Code 插件。近期&#xff0c;腾讯也上了 VS Code 的船&#xff0c;发布了基于 VS Code 的 Tencent SCF Toolkit 插件&#xff0c;…

Codeforces Round #726 (Div. 2) D. Deleting Divisors 博弈

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数nnn&#xff0c;有两个人博弈&#xff0c;每次可以将nnn减去一个nnn的因子&#xff0c;这个因子不能为111或nnn。当不能操作的人输掉游戏。问你先手赢还是后手赢。 思路&#xff1a; 这个题多写…

【POI2007】OSI-Axes of Symmetry【计算几何】【manacher】

题意&#xff1a;给一个 nnn 个点的多边形&#xff0c;求对称轴个数。 n≤105n\leq 10^5n≤105 显然对称轴一定在顶点或边的中点上。 但你 n2n^2n2 枚举完全没有一点能过的样子。 冷静分析&#xff0c;发现有 “中点”&#xff0c;“对称轴”&#xff0c;很自然个鬼地想到了…

端到端测试实践:Jenkins集成TestCafe

上一篇《对产品质量的一点思考》中说到自动化测试的重要性&#xff0c;本文简单介绍下怎样在实际项目中实现端到端测试的自动化&#xff0c;在这里我们使用的端到端测试工具是TestCafe。环境Jenkisn&#xff1a;2.183TestCafe&#xff1a;1.3.0为什么采用TestCafe做自动化测试要…

Codeforces Round #727 (Div. 2) F. Strange Array 线段树 + 区间合并 + 排序优化

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的数组&#xff0c;对每个位置iii求一个最大价值&#xff0c;价值计算方式如下&#xff1a;选择一个包含iii的[l,r][l,r][l,r]&#xff0c;让后将其拿出来排序&#xff0c;之后价值就是当前…

【CF487E】Tourists【圆方树】【树链剖分】【multiset】

题意&#xff1a;给一张 nnn 点 mmm 边的连通无向图&#xff0c;点帯权&#xff0c;qqq 次操作&#xff1a; 修改一个点的权值。询问两点间所有简单路的最小权值的最小值。 n,m,q≤105n,m,q\leq 10^5n,m,q≤105 显然建出圆方树然后询问路径最小值。多半要树链剖分了。 对于方…

再见Jenkins,从Gitlab代码提交到k8s服务持续交付只需七毛三

Gitlab runner 快速搭建CICD pipeline背景日常开发中&#xff0c;相信大家已经做了很多的自动化运维环境&#xff0c;用的最多的想必就是利用Jenkins实现代码提交到自动化测试再到自动化打包&#xff0c;部署全流水线Jenkins在devops担任了很重要的角色&#xff0c;但是另一方面…

Codeforces Round #726 (Div. 2) F. Figure Fixing 二分图 + 思维

传送门 文章目录题意&#xff1a;思路题意&#xff1a; 给你一张nnn个点mmm条边的图&#xff0c;每个点都有一个当前值aia_iai​&#xff0c;目标值bib_ibi​&#xff0c;每次可以选择一条边(i,j)(i,j)(i,j)&#xff0c;将ai,aja_i,a_jai​,aj​都加上任意一个数&#xff0c;问…