好题啊!

调了一个中午,发现有一条语句 \(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]相逢是问候(线段树+拓展欧拉定理)相关推荐

  1. [bzoj 4869] [六省联考2017] 相逢是问候

    相逢是问候 2017-09-09 Description Informatik verbindet dich und mich. 信息将你我连结.(s:看到这个就感觉有毒 B君希望以维护一个长度为n的 ...

  2. 【BZOJ4873】[六省联考2017]寿司餐厅(网络流)

    [BZOJ4873][六省联考2017]寿司餐厅(网络流) 题面 BZOJ 洛谷 题解 很有意思的题目 首先看到答案的计算方法,就很明显的感觉到是一个最大权闭合子图. 然后只需要考虑怎么构图就行了. ...

  3. 六省联考2017 Day1

    目录 2018.3.18 Test T1 BZOJ.4868.[六省联考2017]期末考试 T2 T3 BZOJ.4870.[六省联考2017]组合数问题(DP 矩阵快速幂) 总结 考试代码 T1 T ...

  4. P3749 [六省联考2017]寿司餐厅(最大权闭合子图变形)

    P3749 [六省联考2017]寿司餐厅 最大权闭合子图 有两种建图方式 下面a[i]a_[i]a[​i]表示寿司iii的编号 第二种建图其实就是把di,i也当成一个寿司而已d_{i,i}也当成一个寿 ...

  5. BZOJ 4872 luogu P3750 [六省联考2017]分手是祝愿

    4872: [Shoi2017]分手是祝愿 Time Limit: 20 Sec  Memory Limit: 512 MB [Submit][Status][Discuss] Description ...

  6. [BZOJ4873][六省联考2017]寿司餐厅(最大权闭合子图)

    4873: [Shoi2017]寿司餐厅 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 490  Solved: 350 [Submit][Stat ...

  7. 黑吉辽沪冀晋六省联考 2017 BZOJ 486848694870487148724873

    趁着网络上题解还不是很多,赶快怒写一发骗一下访问量 这套题在BZOJ上的题号是4868-4873. 感觉还不错,就是有一些题弄起来有一点小恶心-- 这套题的部分分给得都很多,很良心的QAQ BZOJ ...

  8. bzoj千题计划262:bzoj4868: [六省联考2017]期末考试

    http://www.lydsy.com/JudgeOnline/problem.php?id=4868 假设 最晚出成绩的是第i天 预处理 cnt[i] 表示 有多少个学生 期望出成绩的那一天 &l ...

  9. [六省联考2017]分手是祝愿(期望+DP)

    题解 很容易想出来最优策略是什么. 就是从n到1看到开着的灯就把它关了 我们预处理出当前状态把灯全部关闭后的最少步数cnt 然后我们的主人公就要瞎按... 设dp[i]代表当前状态最优解为i步时走到d ...

最新文章

  1. php ci项目总结,分享关于php CI框架使用的一点小总结
  2. python3 创建简单的游戏窗口,并有单独的配置文件
  3. Linux破解系统管理员密码
  4. SAP CRM呼叫中心里的Java stack
  5. 台湾计算机读研,台湾省计算机考研_会考教育名副其实
  6. 用html做简易计步器,HTML5 运动计步器
  7. android设置屏幕高度和宽度设置,Android手机的屏幕宽高度和代码设置控件的宽高度...
  8. Netflix:当你按下“播放”的时候发生了什么?
  9. macOS 使用软件(外加装逼特效)
  10. Google谷歌地图基础
  11. 从法外狂徒张三卖房引起的代理模式
  12. golang学习笔记(进阶篇)
  13. Jest测试框架入门之匹配器与测试异步代码
  14. siteservercms 缺点_Siteserver CMS 远程模板下载Getshell漏洞
  15. 为什么只有20%香港人愿意使用移动支付?
  16. Altium Designer 入门学习 -- 放置导线与电气符号
  17. catia安装问题求解决
  18. mysql sles11_Sles11_sp2 64bit MySQL5.6.17编译安装
  19. 双显示器 启动黑屏 黑苹果_黑苹果装机黑屏问题解决方案5500xt
  20. Excel 新增对话式智能分析功能

热门文章

  1. java jersey get_java – Jersey GET请求可以返回一个多态实体吗​​?
  2. struts国际化java_Struts2 的国际化实现方式示例
  3. 关系网络理论︱细讲中介中心性(Betweeness Centrality)
  4. 继承,经典类与新式类的MRO,C3算法,super
  5. 香港设计师带来仿生机器人,其身体 70% 构造均由3D打印完成
  6. I.MX6 ifconfig: SIOCSIFHWADDR: Cannot assign requested address
  7. 不用图像文件的圆角解决--跳起按钮制作(html)
  8. JointJS绘制流程图
  9. 修复RAID-5和镜像磁盘
  10. wsimport 的使用问题