P3747 [六省联考 2017] 相逢是问候(欧拉定理、线段树、光速幂)

解析

洛谷你恶事做尽!
第三个tag在LOJ、bzoj等都是不需要的…
但在洛谷三只log根本过不去…
我谔谔。

如果做过 上帝与集合的正确用法 ,那么本题就并不难了。
打个表就可以发现,不断取欧拉函数的上限只有log级别,这使得我们暴力修改线段树复杂度就是正确的。

然后就做完了?
不!
这题也暴露了我数论知识及其不扎实的事实,拓展欧拉定理的完整内容为:
xb≡xb(modp)(b<φ(p))x^b\equiv x^b\pmod p(b<\varphi(p))xbxb(modp)(b<φ(p))
xb≡xb%φ(p)+φ(p)(modp)(b≥φ(p))x^b\equiv x^{b\%\varphi(p)+\varphi(p)}\pmod p(b\ge\varphi(p))xbxb%φ(p)+φ(p)(modp)(bφ(p))
上帝那个题之所以可以直接当第二条来做,是因为我们认为要求的那个东西绝对大于 φ(p)\varphi(p)φ(p)的。
本题则不然。
所以还需要在上一层快速幂的时候判断以下是否取过模,即是否达到了 φ(p)\varphi(p)φ(p)
总复杂度 O(nlog⁡3n)O(n\log^3n)O(nlog3n)

然后就做完了?
不!
这个代码已经可以在LOJ上AC,但在洛谷打死也T#11。
我们发现,我们每次快速幂的时候的底数都是固定的,模数也就只是 ppp 不断取欧拉函数得到的 O(log⁡)O(\log)O(log) 个数而已。
所以我们可以对每个模数预处理出光速幂,这样就可以把快速幂的log拿掉了。
别忘了快速幂里还要判断是否取模。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define ok debug("OK\n")
using namespace std;const int N=4e5+100;
const int M=2e5+100;
const int inf=1e9;inline ll read(){ll x(0),f(1);char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
bool flag;
const int B=4e4+100;
struct KSM{int c,mod,w;ll mi[B],Mi[B];bool jd[B],Jd[B];void init(int C,int Mod){c=C;mod=Mod;w=sqrt(2*mod);mi[0]=1;for(int i=1;i<=w;i++){mi[i]=mi[i-1]*c;jd[i]=jd[i-1];if(mi[i]>=mod){mi[i]%=mod;jd[i]=1;}}Mi[0]=1;Mi[1]=mi[w];Jd[1]=jd[w];for(int i=2;i<=2*mod/w;i++){Mi[i]=Mi[i-1]*Mi[1];Jd[i]=Jd[i-1];if(Mi[i]>=mod){Mi[i]%=mod;Jd[i]=1;}}}inline ll calc(ll k){if(k>2*mod){printf("k=%lld mod=%d\n",k,mod);}ll res=Mi[k/w]*mi[k%w];flag=Jd[k/w]|jd[k%w];if(res>=mod){res%=mod;flag=1;}		//printf("    k=%lld mod=%d %d %d jd=%d %d res=%lld\n",k,mod,k/w,k%w,Jd[k/w],jd[k%w],res);return res;}
}ksm[40];inline int getphi(int x){int ans=x,top=sqrt(x);for(int i=2;i<=top;i++){if(x%i) continue;ans=1ll*ans*(i-1)/i;while(x%i==0) x/=i;}if(x>1){ans=1ll*ans*(x-1)/x;}return ans;
}int n,m,mod,c;int w[105];
inline int Solve(int k,int lim,int x,int mod){if(k>lim){	flag=x>=mod;	return x%mod;}if(mod<=1){flag=1;return 0;}int phi=w[k],pre=Solve(k+1,lim,x,phi);//printf("  k=%d pre=%d phi=%d mod=%d flag=%d mymod=%d\n",k,pre,phi,mod,flag,ksm[k].mod);//if(pre+flag*phi>ksm[k].mod*2){//	printf("  k=%d pre=%d phi=%d mod=%d flag=%d mi=%d mymod=%d\n",k,pre,phi,mod,flag,pre+flag*phi,ksm[k].mod);
//	}return ksm[k].calc(pre+flag*phi)%mod;
}
inline int solve(int lim,int x,int mod){return Solve(1,lim,x,mod);
}
int top;
void calc(int k,int x){int phi=getphi(x);w[k]=phi;if(x==1){top=k;return;}ksm[k].init(c,x);calc(k+1,phi);
}int a[N];
#define mid ((l+r)>>1)
#define ls (k<<1)
#define rs (k<<1|1)
int mn[N<<2],sum[N<<2];
inline void pushup(int k){mn[k]=min(mn[ls],mn[rs]);sum[k]=(sum[ls]+sum[rs])%mod;return;
}
void build(int k,int l,int r){if(l==r){sum[k]=a[l];return;}build(ls,l,mid);build(rs,mid+1,r);pushup(k);
}
int ask(int k,int l,int r,int x,int y){if(x<=l&&r<=y) return sum[k];int res(0);if(x<=mid) res+=ask(ls,l,mid,x,y);if(y>mid) res+=ask(rs,mid+1,r,x,y);res%=mod;return res;
}
void change(int k,int l,int r,int x,int y){if(mn[k]>=top) return;if(l==r){mn[k]++;sum[k]=solve(mn[k],a[l],mod);//printf("k=%d pos=%d mn=%d sum=%d\n",k,l,mn[k],sum[k]);return;}if(x<=mid) change(ls,l,mid,x,y);if(y>mid) change(rs,mid+1,r,x,y);pushup(k);
}
void write(int x){if(x>9) write(x/10);putchar('0'+x%10);
}signed main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();m=read();mod=read();c=read();w[0]=mod;calc(1,mod);//printf("top=%d\n",top);//for(int i=0;i<mod;i++){//	for(int j=0;j<=top;j++) printf("x=%d tim=%d %lld\n",i,j,solve(j,i,mod));//}//return 0;for(int i=1;i<=n;i++) a[i]=read();build(1,1,n);for(int i=1;i<=m;i++){int op=read(),l=read(),r=read();//ok;if(op==0) change(1,1,n,l,r);else{write(ask(1,1,n,l,r));putchar('\n');}}return 0;
}
/*
*/

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

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

相关文章

Lottery Gym - 102822L

Lottery Gym - 102822L 题意&#xff1a; 有n个盒子&#xff0c;每个盒子有x个球&#xff0c;每个球的数值为2a,问最多能组成多少数&#xff1f;答案mod 1e97 题解&#xff1a; 二进制思维题&#xff0c;浓浓的cf风格 参考题解 我们将数按照幂次进行排序&#xff08;从小到…

[CCO 2019] Sirtet(差分约束+最短路)

[CCO 2019] Sirtetdescriptionsolutioncodedescription 题目链接 solution 很巧妙地将差分约束隐藏起来 问题的关键在于求出每一个sand停止运动的时间&#xff0c;这样很容易填涂出最后的答案&#xff08;向下平移即可&#xff09; 不妨设 ti,jt_{i,j}ti,j​ 表示 (i,j)(i…

P3748 [六省联考 2017] 摧毁“树状图”(树形dp)

Foreword\text{Foreword}Foreword 《小清新》树形 dp。 其实本题没有那么&#xff08;重读&#xff09;恶心&#xff0c;但我一开始写完 x0x0x0 后眼瞎没有看到 x1,2x1,2x1,2 时也必然是最优方案&#xff08;这种东西不黑体吗…&#xff09;可以直接无视&#xff0c;还在苦苦的…

微软4年后重登市值第一,纳德拉如何做到的?

他用4年多时间将微软的市值提高了5000亿美元&#xff0c;超越苹果再次成为全球市值最高的上市公司。译 | 达达萨提亚纳德拉&#xff08;Satya Nadella&#xff09;2014年刚刚执掌微软时&#xff0c;微软当时是一个日渐没落的帝国。但在他领导的4年多时间里&#xff0c;微软百花…

[AtCoder Regular Contest 124E] Pass to Next(dp+数学)

ARC 124 E Pass to Nextproblemsolutioncodeproblem 题目链接 solution 令 ci:c_i:ci​: 第 iii 个人传给下一个人球的个数 当 min⁡{ci}≠0\min\{c_i\}\neq 0min{ci​}​0 时&#xff0c;将每一个 cic_ici​ 都减小 111&#xff0c;显然答案序列并不会改变 所以&#x…

P2015 二叉苹果树

P2015 二叉苹果树 题意&#xff1a; 一个完全二叉树&#xff0c;n个点&#xff0c;n-1个边&#xff0c;每个边都有边权&#xff0c;问保留q个边&#xff0c;所能保留的最大边权是多少 题解&#xff1a; 树形dp dp[u][i]表示u的子树上保留i条边&#xff0c;至多保留的苹果数…

P4384 [八省联考 2018] 制胡窜(SAM)

Foreword\text{Foreword}Foreword 人都道正难则反&#xff0c;我偏说正也不难。 这里介绍一种正面直接统计的做法。 和补集做法相比&#xff0c;没有那么多的分类讨论&#xff0c;更多的是对问题的正向分析和逐层化简、转化&#xff0c;也并不麻烦。 由于需要写很多线段树的操作…

【.NET Core项目实战-统一认证平台】第十五章 网关篇-使用二级缓存提升性能

首先说声抱歉&#xff0c;可能是因为假期综合症&#xff08;其实就是因为懒哈&#xff09;的原因&#xff0c;已经很长时间没更新博客了&#xff0c;现在也调整的差不多了&#xff0c;准备还是以每周1-2篇的进度来更新博客&#xff0c;并完成本项目所有功能。言归正传&#xff…

树上子链(树形dp求树的直径)

树上子链 题意&#xff1a; 给定一棵树 T &#xff0c;树 T 上每个点都有一个权值。 定义一颗树的子链的大小为&#xff1a;这个子链上所有结点的权值和 。 请在树 T 中找出一条最大的子链并输出。 题解&#xff1a; 求树的直径&#xff0c;题目中存在负权值&#xff0c;树…

【无码专区1】简单路径的第二大边权(启发式合并+最小生成树)

只有std&#xff0c;没有自我实现&#xff0c;所以叫做无码专区 description 给一张无向图&#xff0c;多次询问&#xff0c;每次询问两个点之间所有简单路径&#xff08;不重复经过点&#xff09;中边权第二大&#xff08;不是严格第二大&#xff09;的权值的最小值。 数据…

# CF1572B Xor of 3(构造)

解析 你CF还是你CF 省选刷到2017再往前不是很想做了&#xff0c;就来CF玩一玩。 再次感受到被CF浅颜色构造虐的快感。 本题靠着各种乱搞特判在WA了无数次之后艹过去了。 根本没有什么正确性的玄学做法&#xff0c;但是看CF数据似乎把 nnn 较小的所有情况全都pia到数据里了&…

NET Core微服务之路:简单谈谈对ELK,Splunk,Exceptionless统一日志收集中心的心得体会...

前言日志&#xff0c;一直以来都是开发人员和运维人员最关心的问题。开发人员可通过日志记录来协助问题定位&#xff0c;运维人员可通过日志发现系统隐患&#xff0c;故障等定位问题。如果你的系统中没有日志&#xff0c;就像一个断了线的风筝&#xff0c;你永远不知道它会的落…

【无码专区2】序列划分(数学)

有std&#xff0c;但是没有自我实现&#xff0c;所以是无码专区 description 完全由数字组成的字符串 sss&#xff0c;划分成若干段&#xff0c;每一段看成一个十进制的数&#xff08;允许前导零&#xff09;求有多少种划分方法使得相邻两个数至少一个是 DDD 的倍数。对 1097…

Rinne Loves Edges

Rinne Loves Edges 题意&#xff1a; 有n给点&#xff0c;m个边&#xff0c;每个边有边权&#xff0c;给你一个点S&#xff0c;问最少花多少代价&#xff0c;可以让叶子节点无法与S点连通 题解&#xff1a; dp[u]:表示u到叶子节点的最短费用的和 dp[u]min(dp[v],w); 代码&…

.NET Core 中的 Generic Host快速使用指南

本文以自己在工作中学习和使用.net core generic-host 作一个总结。前言在创建的ASPNETCORE项目中&#xff0c;我们可以在Main()中看见&#xff0c;我们通过IWebHostBuild创建了一个IWebHost&#xff0c;而微软提供了WebHost.CreateDefaultBuilder(args)来帮助我们更轻松得创建…

CF1580B Mathematics Curriculum(笛卡尔树、树形dp)

解析 比较巧妙的一道题。 难点在于对题意的转化。 关键性质&#xff1a;符合要求的点等价于与笛卡尔树上深度为 mmm 的点。 原因也较为显然&#xff0c;考虑一个特定的点 xxx&#xff0c;当枚举全局最大值时&#xff0c;其会对 xxx 产生贡献&#xff0c;且最大值另一侧就和 xx…

CF1368G Shifting Dominoes(扫描线求矩阵的并集)

CF1368G Shifting Dominoesproblemsolutioncodeproblem 题目链接 solution 求的是最后棋盘本质不同的个数&#xff0c;而本质不同等价于两个空格位置不同。 如果想要移动一个多米诺骨牌&#xff0c;要求长边上下方有空位。 移动可以看成空位的移动。 所以我们考虑把一个 …

吉吉王国(二分+树形dp)

吉吉王国 题意&#xff1a; n个点&#xff0c;m个边&#xff0c;有边权&#xff0c;现在要求叶子节点无法与1号点连通&#xff0c;要求切断的总长度不能超过m&#xff0c;且切断的最长的长度尽可能断 题解&#xff1a; 题意的前半部分可以确定是树形dp&#xff0c;后半部分…

P3239 [HNOI2015]亚瑟王(期望)

解析 显然可以利用期望的线性性对每张牌单独计算贡献。 现在的关键就是如何求出每张牌被使用的概率。 考虑第 iii 张牌&#xff0c;如果它的前面 [1,i−1][1,i-1][1,i−1] 中有 jjj 张牌被使用&#xff0c;那么它被使用的概率就是 1−(1−pi)r−j1-(1-p_i)^{r-j}1−(1−pi​)…

微软一顿操作猛如虎,PowerShell 排名直线上升

近日&#xff0c;TIOBE 发布了 2019 年 3 月编程语言排行榜&#xff0c;PowerShell 首次进入到了榜单的 Top 50 中&#xff0c;排在第 45 位。PowerShell 是运行在 Windows 操作系统上实现对系统以及应用程序进行管理自动化的命令行脚本环境。&#xff08;PowerShell 排在了 TI…