题解:P7334 [JRKSJ R1] 吊打

news/2025/9/26 19:35:22/文章来源:https://www.cnblogs.com/D3906-ourstar/p/19113895

洛谷。

题目传送门。

本 DS 领域萌新花了 4h 才切掉此题,遂写篇题解纪念一下。

分析

首先需要明确一点:这题不能直接维护原序列,因为平方时不能直接取模,这就导致结果会非常大,很容易溢出。

为什么不能直接取模呢?举个例子,对 \(10^8\) 平方一次再开根,答案还是 \(10^8\);但如果平方时对 \(998244353\) 取模了,答案就会变成 \(346563789\),这显然不对。

那么考虑不直接维护原序列该怎么做。暂时不管开根,只考虑平方。设 \(a_i\) 被平方了 \(cnt_i\) 次,那么可以发现,\(a_i\) 会变为 \(a_i^{2^{cnt_i}}\)。此时 \(2^{cnt_i}\) 同样因为太大,也无法维护;但是 \(cnt_i\) 就小得多了,至多为 \(2\times10^5\)。因此,我们可以维护 \(cnt_i\),将区间平方转化为区间加。这个可以搞上一个分块。

于是来考虑有开根该怎么做。还是本着维护 \(cnt_i\) 的思想,对于散块中的任意位置 \(i\),我们可以简单分讨一下:

  • \(a_i\le1\),跳过;

  • \(cnt_i=0\)\(a_i\leftarrow \lfloor\sqrt{a_i}\rfloor\)

  • \(cnt_i\ge1\)\(cnt_i \leftarrow cnt_i-1\)

然后考虑对于整块该怎么处理。我们设 \(mn_i\) 表示第 \(i\) 块上的 \(cnt\) 的最小值,当前整块的编号为 \(i\),依然分讨:

  • 若第 \(i\) 块全为 \(1\),跳过;

  • \(mn_i=0\),直接把第 \(i\) 块当作散块处理(由势能分析,这一步的复杂度是有保障的);

  • 否则,将第 \(i\) 块上的所有 \(cnt_j\leftarrow cnt_j-1\)

但接下来,我们还有一个问题没有解决——查询时,作为 \(a_i\) 次数的 \(2^{cnt_i}\) 依然很大,没法直接求,怎么办?

这时候就需要一点——数学技巧

我们希望找到一种手段,可以把 \(a_i\) 的次数降下来,也就是通常所说的降幂

降幂?有没有觉得很熟悉——没错,扩展欧拉定理

由扩展欧拉定理,我们知道,当 \(a\perp m\) 时,有 \(a^b \equiv a^{b \mod \varphi(m)}\pmod m\)

而此题中,\(m=998244353\),是一个质数,所以 \(\varphi(m)=m-1=998244352\)。也就是说,运用扩展欧拉定理降幂之后,\(a_i\) 的次数变为 \(2^{cnt_i} \mod 998244352\),这个数就可以用快速幂直接求了!

于是我们就可以愉快地 AC 了!

代码

代码中的变量名与上面使用的名称保持一致,(应该)很好看懂。

#include<iostream>
#include<cmath>
#define ll unsigned long long
using namespace std;const int N=2e5+5;
const int M=1e3+5;
const ll p=998244353;int n,m;
ll ans;int a[N];namespace OIfast{char buf[1<<21],*p1,*p2,*top, buffer[1<<21];#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?0:*p1++)#define gc getchar()inline int read(){int n=0;char c=gc;while(!isdigit(c))c=gc;while(isdigit(c))n=(n<<3)+(n<<1)+(c^48),c=gc;return n;}}using namespace OIfast;inline ll qpow(ll a,int b,ll mod){ll res=1;while(b){if(b&1)(res*=a)%=mod;b>>=1,(a*=a)%=mod;}return res;
}namespace FK{int k/*块长*/,tot/*块数*/;int cnt[N]/*平方次数*/;int L[M]/*L[i] -> 第 i 块的左端点*/,R[M]/*R[i] -> 第 i 块的右端点*/,loc[N]/*loc[i] -> 第 i 个数在第几块*/,mn[M]/*cnt*/,la[M]/*cnt*/;bool flag[M]/*是否全为 1*/;inline void pushup(int i){mn[i]=1e9,flag[i]=1;for(int j=L[i];j<=R[i];++j)mn[i]=min(mn[i],cnt[j]),flag[i]&=(a[j]<=1);return ;}inline void pushdown(int i){for(int j=L[i];j<=R[i];++j)cnt[j]+=la[i];return la[i]=0,void();}inline void init(){k=sqrt(n),tot=ceil((1.0*n)/(1.0*k));for(int i=1;i<=tot;++i){L[i]=(i-1)*k+1,R[i]=min(n,L[i]+k-1);for(int j=L[i];j<=R[i];++j)loc[j]=i;pushup(i);}return ;}inline void sk(int l,int r){pushdown(loc[l]);for(int i=l;i<=r;++i){if(a[i]<=1)continue ;if(!cnt[i])a[i]=sqrt(a[i]);else --cnt[i];}return pushup(loc[l]),void();}inline void upd1(int l,int r){//开根if(loc[l]==loc[r])sk(l,r);else{sk(l,R[loc[l]]),sk(L[loc[r]],r);for(int i=loc[l]+1;i<=loc[r]-1;++i){if(flag[i])continue ;if(mn[i]+la[i]<=1)sk(L[i],R[i]);else --la[i],--mn[i];}}return ;}inline void upd2(int l,int r){//平方if(loc[l]==loc[r]){pushdown(loc[l]);for(int i=l;i<=r;++i)++cnt[i];pushup(loc[l]);}else{pushdown(loc[l]);for(int i=l;i<=R[loc[l]];++i)++cnt[i];pushup(loc[l]);pushdown(loc[r]);for(int i=L[loc[r]];i<=r;++i)++cnt[i];pushup(loc[r]);for(int i=loc[l]+1;i<=loc[r]-1;++i)++la[i],++mn[i];}return ;}}using namespace FK;inline void work(){int op=read(),l=read(),r=read();return op==1?upd1(l,r):upd2(l,r),void();
}signed main(){n=read(),m=read();for(int i=1;i<=n;++i)a[i]=read();init();while(m--)work();for(int i=1;i<=tot;++i)pushdown(i);for(int i=1;i<=n;++i)(ans+=qpow(a[i],qpow(2,cnt[i],p-1),p))%=p;return printf("%lld\n",ans),0;
}

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

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

相关文章

当不小心误触了一个事件该如何删除呢

以Button按钮为例 ,当不小心多点了一下会生成一个事件方法 ,那么该如何去进行一个解决呢方法:点击属性 ,找到事件 ,在对应的事件中右键点击重置 然后再删除对应的一个事件方法即可

跑腿小工具|基于微信小脚本的跑腿平台小程序设计与实现(源码+数据库+文档)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量 - 教程

Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !import…

wordpress 手机端模板三台网站seo

1.v-if和v-show的区别&#xff1f; 都是可以控制元素的显示和隐藏 1.v-show是控制元素的display值来让元素显示和隐藏&#xff1b;v-if显示&#xff08;隐藏&#xff09;时会把整个DOM元素添加&#xff08;删除&#xff09; 2.v-show只是简单的css切换&#xff1b;v-if有一个局…

三里屯网站建设公司ps怎么做网页设计

应用部署方式演变 1.传统部署2.虚拟化部署3.容器化部署 1.传统部署 传统的应用程序部署是将多个应用程序直接部署在操作系统上&#xff0c;一旦其中的某个应用程序出现内存泄漏&#xff0c;那么该程序就会大量吞噬系统内容空间&#xff0c;导致其他应用程序无法正常运行。 2.虚…

烧录工具使用方法大公开:实用说明文档奉上

烧录工具的正确使用方式究竟是什么?今天就为你揭开谜底,提供一份实用又专业的使用说明,助你高效完成任务。 本文就以 Air780EPM 开发板为例,演示烧录工具的使用步骤。 一. 生成量产文件 注意:如果已经生成量产文件…

实用指南:【C++实战㊷】C++ 原型模式实战:从概念到高效应用

实用指南:【C++实战㊷】C++ 原型模式实战:从概念到高效应用2025-09-26 19:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !import…

静态网站什么意思找资源的关键词有哪些

Redis 基本概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的使用 ANSI C 语言编写的、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库&#xff0c;并提供多种语言的 API。它通常被称为数据结构服务器&#xff0c;因为值&#xff08;value…

秦州建设网站网站写作赚钱

介绍form-create 是一个可以通过 JSON 生成具有动态渲染、数据收集、验证和提交功能的表单生成器。并且支持生成任何 Vue 组件。结合内置17种常用表单组件和自定义组件&#xff0c;再复杂的表单都可以轻松搞定。文档 | github演示项目: 开源的高品质微信商城功能自定义组件可生…

咸阳学校网站建设多少钱做一个网站需要多少钱大概

近年AI技术非常火热&#xff0c;有人就说&#xff0c;用AI写代码程序员不就都得下岗吗&#xff1f;对此我的回答是否定的&#xff0c;因为AI虽然已经有了编写代码的能力&#xff0c;但它现在的水平大多还仅限于根据业务需求搭建框架&#xff0c;而具体的功能实现还尚且稚嫩&…

警惕新型XCSSET macOS恶意软件变种,专攻Xcode开发者

微软威胁情报团队发现新型XCSSET macOS恶意软件变种,该变种具备增强的浏览器数据窃取、剪贴板劫持功能及持久化机制,通过感染Xcode项目传播,主要针对苹果开发者群体。目前攻击范围有限,建议开发者保持系统更新并谨…

前端面经-高级开发(华为od) - 实践

前端面经-高级开发(华为od) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

2025权威排行榜:公众号编辑器Top 6深度测评,哪款最适合你

作为每天要处理3-5篇公众号推文的运营,你是否也曾经历过「写稿2小时、排版3小时」的崩溃?选题抓不住热点、配图担心版权风险、多平台分发重复操作到深夜——这些新媒体人的日常痛点,本质上是工具链断裂导致的效率损…

素材网站上的元素是怎么做的wordpress接单修改任务

大家应该知道吧!现在手机市场已经被智能手机垄断了&#xff0c;走到哪儿智能手机都跟我们形影不离。虽然像三星、 苹果 一样的大牌手机比较出名&#xff0c;但是我们的国产手机这几年发展的也是很不错的&#xff0c;就好比国内最火爆的 小米 手机&#xff0c;这个品牌的手机上市…

网站后期维护包括网线制作图解

基于昇腾910B训练万亿参数的语言模型 Abstract 在本工作中&#xff0c;作者开发了一个系统&#xff0c;该系统在Ascend 910 AI处理器集群和MindSpore框架上训练了一个万亿参数的语言模型&#xff0c;并提出了一个含有1.085T参数的语言模型&#xff0c;名为PanGu-。 从PanGu-[…

南宁网站建设网站建设wordpress说明文档交接

文章结束给大家来个程序员笑话&#xff1a;[M] 在XT上可以设预条目模板&#xff08;EntryTemplate&#xff09;来到达模板化制控上传文档安全性和属性等信息的作用。而EntryTemplate本身可以与Folder相干联&#xff08;一个Folder可以关联多个EntryTemplate&#xff09;&#x…

在网站后台为什么不显示百分号网站维护托管公司

来源&#xff1a;哲学园作者&#xff1a;约翰R塞尔译者&#xff1a;GTY约翰塞尔生于1932年&#xff0c;当代著名哲学家&#xff0c;现为美国加州大学伯克利分校Slusser哲学教授&#xff0c;在语言哲学、心灵哲学和社会哲学领域贡献巨大&#xff0c;是目前在世的最著名的分析哲学…

什么是 glTF:完整指南

无论您是在设计复杂的 3D 产品配置器还是构建身临其境的虚拟体验,GLTF(GL 传输格式)都会发挥作用。本博客将详细介绍您需要了解的有关 GLTF 的所有信息,解释它是什么、为什么它很重要以及它如何改变 3D 景观。什么…

垃圾收集器与核心算法详解(上)

垃圾收集器ParNew&CMS与底层三色标记算法详解 一、垃圾收集算法:分代理论下的三大核心实现 分代收集理论是基础,核心逻辑是按对象存活周期将堆分为新生代(存活短)和老年代(存活长),针对不同年代选择效率最优…