[六省联考2017]相逢是问候(线段树+拓展欧拉定理)
好题啊!
调了一个中午,发现有一条语句 \(RE\) 了。在 \(windows\) 下没关系,\(linux\) 下有问题,大大的问题。
while(phi[tot]!=1) phi[++tot]=calc_phi(phi[tot-1]);
算是拓展欧拉定理的题吧。线段树只是一个工具,最主要还是暴力修改。因为 \(\varphi\) 不断套下去最多会有 \(\lfloor \log n\rfloor\) 层,所以我们对于每一层暴力算一遍,加上快速幂,时间复杂度 \(O(n\log^3 n)\),显然可能被卡。怎么优化呢?
将 \(O(\log n)\) 的快速幂换成 \(O(1)\) 的快速幂就好了,时间复杂度 \(O(n\log^2 n)\)
\(Code\ Below:\)
#include <bits/stdc++.h>
#define int long long
#define lson (rt<<1)
#define rson (rt<<1|1)
using namespace std;
const int maxn=100000+10;
const int base=(1<<14)-1;
int n,m,p,c,a[maxn],sum[maxn<<2],Min[maxn<<2],pw1[55][maxn],pw2[55][maxn],phi[maxn],tot;
bool b1[55][maxn],b2[55][maxn],flag;inline int read(){register int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return (f==1)?x:-x;
}int calc_phi(int n){int ans=n,m=sqrt(n);for(int i=2;i<=m;i++){if(n%i==0){ans=ans/i*(i-1);while(n%i==0) n/=i;}}if(n>1) ans=ans/n*(n-1);return ans;
}void pre(){int tmp=p;phi[0]=p;while(tmp!=1) tmp=calc_phi(tmp),phi[++tot]=tmp;phi[++tot]=1;for(int i=0;i<=tot;i++){pw1[i][0]=1;for(int j=1;j<=base+1;j++){pw1[i][j]=pw1[i][j-1]*c;if(pw1[i][j]>=phi[i]) b1[i][j]=1,pw1[i][j]%=phi[i];b1[i][j]|=b1[i][j-1];}}for(int i=0;i<=tot;i++){pw2[i][0]=1;b2[i][1]=b1[i][base+1];for(int j=1;j<=base;j++){pw2[i][j]=pw2[i][j-1]*pw1[i][base+1];if(pw2[i][j]>=phi[i]) b2[i][j]=1,pw2[i][j]%=phi[i];b2[i][j]|=b2[i][j-1];}}
}int calc(int a,int dep){flag=0;int x=a&base,y=(a>>14)&base;int ans=pw1[dep][x]*pw2[dep][y];if(ans>=phi[dep]) flag=1,ans%=phi[dep];flag|=b1[dep][x]|b2[dep][y];return ans;
}int dfs(int a,int dep,int lim){flag=0;if(dep==lim){if(a>=phi[dep]) flag=1,a%=phi[dep];return a;}int b=dfs(a,dep+1,lim);return calc(flag?b+phi[dep+1]:b,dep);
}inline void pushup(int rt){sum[rt]=(sum[lson]+sum[rson])%p;Min[rt]=min(Min[lson],Min[rson]);
}void build(int l,int r,int rt){if(l == r){sum[rt]=a[l];return ;}int mid=(l+r)>>1;build(l,mid,lson);build(mid+1,r,rson);pushup(rt);
}void update(int L,int R,int l,int r,int rt){if(Min[rt]>=tot) return ;if(l == r){Min[rt]++;sum[rt]=dfs(a[l],0,Min[rt]);return ;}int mid=(l+r)>>1;if(L <= mid) update(L,R,l,mid,lson);if(R > mid) update(L,R,mid+1,r,rson);pushup(rt);
}int query(int L,int R,int l,int r,int rt){if(L <= l && r <= R){return sum[rt];}int mid=(l+r)>>1,ans=0;if(L <= mid) ans=(ans+query(L,R,l,mid,lson))%p;if(R > mid) ans=(ans+query(L,R,mid+1,r,rson))%p;return ans;
}signed main()
{n=read(),m=read(),p=read(),c=read();for(int i=1;i<=n;i++) a[i]=read();pre();build(1,n,1);int op,l,r;while(m--){op=read(),l=read(),r=read();if(op==0) update(l,r,1,n,1);if(op==1) printf("%lld\n",query(l,r,1,n,1));}return 0;
}
转载于:https://www.cnblogs.com/owencodeisking/p/10227494.html
[六省联考2017]相逢是问候(线段树+拓展欧拉定理)相关推荐
- [bzoj 4869] [六省联考2017] 相逢是问候
相逢是问候 2017-09-09 Description Informatik verbindet dich und mich. 信息将你我连结.(s:看到这个就感觉有毒 B君希望以维护一个长度为n的 ...
- 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)
[BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...
- 六省联考2017 Day1
目录 2018.3.18 Test T1 BZOJ.4868.[六省联考2017]期末考试 T2 T3 BZOJ.4870.[六省联考2017]组合数问题(DP 矩阵快速幂) 总结 考试代码 T1 T ...
- P3749 [六省联考2017]寿司餐厅(最大权闭合子图变形)
P3749 [六省联考2017]寿司餐厅 最大权闭合子图 有两种建图方式 下面a[i]a_[i]a[i]表示寿司iii的编号 第二种建图其实就是把di,i也当成一个寿司而已d_{i,i}也当成一个寿 ...
- BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿
4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec Memory Limit: 512 MB [Submit][Status][Discuss] Description ...
- [BZOJ4873][六省联考2017]寿司餐厅(最大权闭合子图)
4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 490 Solved: 350 [Submit][Stat ...
- 黑吉辽沪冀晋六省联考 2017 BZOJ 486848694870487148724873
趁着网络上题解还不是很多,赶快怒写一发骗一下访问量 这套题在BZOJ上的题号是4868-4873. 感觉还不错,就是有一些题弄起来有一点小恶心-- 这套题的部分分给得都很多,很良心的QAQ BZOJ ...
- bzoj千题计划262:bzoj4868: [六省联考2017]期末考试
http://www.lydsy.com/JudgeOnline/problem.php?id=4868 假设 最晚出成绩的是第i天 预处理 cnt[i] 表示 有多少个学生 期望出成绩的那一天 &l ...
- [六省联考2017]分手是祝愿(期望+DP)
题解 很容易想出来最优策略是什么. 就是从n到1看到开着的灯就把它关了 我们预处理出当前状态把灯全部关闭后的最少步数cnt 然后我们的主人公就要瞎按... 设dp[i]代表当前状态最优解为i步时走到d ...
最新文章
- php ci项目总结,分享关于php CI框架使用的一点小总结
- python3 创建简单的游戏窗口,并有单独的配置文件
- Linux破解系统管理员密码
- SAP CRM呼叫中心里的Java stack
- 台湾计算机读研,台湾省计算机考研_会考教育名副其实
- 用html做简易计步器,HTML5 运动计步器
- android设置屏幕高度和宽度设置,Android手机的屏幕宽高度和代码设置控件的宽高度...
- Netflix:当你按下“播放”的时候发生了什么?
- macOS 使用软件(外加装逼特效)
- Google谷歌地图基础
- 从法外狂徒张三卖房引起的代理模式
- golang学习笔记(进阶篇)
- Jest测试框架入门之匹配器与测试异步代码
- siteservercms 缺点_Siteserver CMS 远程模板下载Getshell漏洞
- 为什么只有20%香港人愿意使用移动支付?
- Altium Designer 入门学习 -- 放置导线与电气符号
- catia安装问题求解决
- mysql sles11_Sles11_sp2 64bit MySQL5.6.17编译安装
- 双显示器 启动黑屏 黑苹果_黑苹果装机黑屏问题解决方案5500xt
- Excel 新增对话式智能分析功能
热门文章
- java jersey get_java – Jersey GET请求可以返回一个多态实体吗​​?
- struts国际化java_Struts2 的国际化实现方式示例
- 关系网络理论︱细讲中介中心性(Betweeness Centrality)
- 继承,经典类与新式类的MRO,C3算法,super
- 香港设计师带来仿生机器人,其身体 70% 构造均由3D打印完成
- I.MX6 ifconfig: SIOCSIFHWADDR: Cannot assign requested address
- 不用图像文件的圆角解决--跳起按钮制作(html)
- JointJS绘制流程图
- 修复RAID-5和镜像磁盘
- wsimport 的使用问题