当前位置: 首页 > news >正文

洛谷 P3747 [六省联考 2017] 相逢是问候

题目链接

欧拉降幂最多只会迭代到第 \(k = \text O (\log p)\) 次模数就会变成 \(1\)(证明见这里)。故一个数被操作超过 \(k\) 次就会变为一个定值。

于是用线段树维护出操作还没有满 \(k\) 次的位置,每次暴力修改并计算,均摊下来只有 \(nk\) 次。光速幂可以预处理。

时间复杂度 \(\text O (k \sqrt p + nk \log n + nk ^ 2)\)

#include<cstdio>
#include<cmath>
#define N 50005
#define M 55
using namespace std;int n,m,p,c,k,a[N],mo[M];
int pw[M][N],Pw[M][N];
int mod(long long x,int p) {if(x<p) return x;return x%p+p;
}
int phi(int x) {int res=x;for(int i=2;i<=x/i;i++) if(x%i==0) {res=res/i*(i-1);while(x%i==0) x/=i;}if(x>1) res=res/x*(x-1);return res;
}
int qqpow(int x,int y,int p) {return mod(1ll*pw[p][y&(1<<14)-1]*Pw[p][y>>14],mo[p]);
}
int calc(int x,int p,int d) {if(p>d) return mod(x,mo[p]);return qqpow(x,calc(x,p+1,d),p);
}
struct segment_tree {struct st {int l,r,c,cnt,sum; bool tag;#define l(p) tr[p].l#define r(p) tr[p].r#define c(p) tr[p].c#define cnt(p) tr[p].cnt#define sum(p) tr[p].sum#define tag(p) tr[p].tag} tr[N*4];void update(int p) {sum(p)=(sum(p*2)+sum(p*2+1))%mo[1];tag(p)=tag(p*2)|tag(p*2+1);}void build(int p,int l,int r) {l(p)=l,r(p)=r,tag(p)=1;if(l==r) {c(p)=sum(p)=a[l]; return;}int mid=l+r>>1;build(p*2,l,mid),build(p*2+1,mid+1,r);update(p);}void modify(int p,int l,int r) {if(!tag(p)) return;if(l(p)==r(p)) {cnt(p)++,sum(p)=calc(c(p),1,cnt(p))%mo[1],tag(p)=cnt(p)<k;return;}if(l<=r(p*2)) modify(p*2,l,r);if(r>=l(p*2+1)) modify(p*2+1,l,r);update(p);}int ask(int p,int l,int r) {if(l<=l(p)&&r>=r(p)) return sum(p);if(r<=r(p*2)) return ask(p*2,l,r);if(l>=l(p*2+1)) return ask(p*2+1,l,r);return (ask(p*2,l,r)+ask(p*2+1,l,r))%mo[1];}
} t1;
int main() {scanf("%d%d%d%d",&n,&m,&p,&c);for(int i=1;i<=n;i++) scanf("%d",&a[i]);while(p>1) mo[++k]=p,p=phi(p);mo[++k]=p;for(int i=1;i<=k;i++) {int w=1;for(int j=0;j<1<<14;j++) pw[i][j]=w,w=mod(1ll*w*c,mo[i]);int cc=w; w=1;for(int j=0;j<1<<14;j++) Pw[i][j]=w,w=mod(1ll*w*cc,mo[i]);}mo[k+1]=1,t1.build(1,1,n);for(int i=1,op,x,y;i<=m;i++) {scanf("%d%d%d",&op,&x,&y);if(!op) t1.modify(1,x,y);else printf("%d\n",t1.ask(1,x,y));}return 0;
}
http://www.jsqmd.com/news/269075/

相关文章:

  • Gemini 336L - 调试记录(Ubuntu 24.04)
  • 电缆敷设施工机械-哪个品牌的电缆输送机好用
  • 深入解析:从C++开始的编程生活(16)——继承
  • 13.6B参数铸就“世界模型”,美团LongCat-Video搭建5分钟原生视频生成,定义AI视频新标杆
  • 怎样免费在线把 HEIC 转为 JPG?无需安装软件,也不用上传照片
  • NodeJS生产环境发布流程
  • 2026年趋势全景图:AI重塑技术与翻译行业,这些变化你必须知道!
  • 人工智能标注工程师证书:超越标注之框,赋能技能跃迁
  • 考完PMP这几件事一定要做!
  • 竞品关键词实战指南:从挖掘到落地,抢占搜索流量高地
  • 深入解析Excel数组:从基础概念到高阶应用的完全指南
  • 参考文献怎么找:高效查找参考文献的实用方法与技巧
  • 数据(数据分析与大数据开发)的地位与作用?
  • Java程序员如何突击即将来临的春招?该做哪些技术储备? - 教程
  • 温州精密机械工厂10个SolidWorks设计画图共享一套SolidWorks
  • 连续3个月破10万!华为乾崑今年目标300万台
  • UI-TARS-desktop实战:用自然语言轻松操控电脑任务
  • 学术搜索引擎:高效获取学术资源的必备工具与使用指南
  • 导师严选 2026 毕业论文必备的8款AI论文软件测评
  • 环境监测仪器:认识十要素微气象仪
  • 【PFJSP问题】基于matlab自适应双种群协同鸡群算法ADPCCSO求解置换流水车间调度问题PFSP【含Matlab源码 14995期】
  • 氘可来昔替尼:全球首款 TYK2 变构抑制剂,改写银屑病治疗格局
  • 【优化形状】基于matlab非主导排序遗传算法的翼型形状优化【含Matlab源码 14992期】含报告
  • 智能体工作原理全解析:从环境感知到行动决策,收藏这篇就够了!
  • 横河 AQ6370E 光谱分析仪
  • 【数字信号去噪】基于matlab改进的灰狼算法和条件重初始化策略模型无主动噪声控制【含Matlab源码 15001期】
  • 邦芒解析:最难升职的六种职场人员
  • 58 同城 item_get - 获取详情数据接口对接全攻略:从入门到精通
  • 【2026年精选毕业设计:基于多模态识别的社区智能报修与设施巡检系统(含全套资料)】
  • 58 同城 item_search - 获取搜索数据接口对接全攻略:从入门到精通