Codeforces Round #305 (Div. 2)
C.Mike and Frog(思维+拓展GCD)
•题意
给你初始高度 h1,h2 和目标高度 a1,a2 以及参数 m,x1,y1,x2,y2;
每次操作都可以使得 h1=(h1⋅x1+y1) mod m , h2=(h2⋅x2+y2) mod m;
问最少经过多少次操作可以使得 h1 变为 a1 的同时,h2 变为 a2;
•题解
因为涉及取模的操作,所以,一定会有循环节;
任意给定 2m 个数,假设为 a1,a2,⋯,a2m,那么一定有 ∃ i,j: ai mod m=aj mod m ,i≠j;
但因为本题 h 之间都是有联系的,所以,对于 h1 来说,操作 2m 次,一定会出现循环节;
如果一个循环节中没有出现目标高度 a1,那么,在以后的循环中,一定也不会出现 a1;
但是,a1 没有出现在循环节中并不代表 h1 不能变成 a1,因为 a1 可能出现在循环开始前;
例如,假设 m=10,h1=1,a1=1,x1=2,y1=0;
h1 的变化如下:
h1:1→2→4→8→6→2→⋯
易得其变化的循环节为:2→4→8→6;
而目标高度 1 出现在循环开始前;
当然,题面说了 a1≠h1,这个例子只是说明一下会有 “目标高度出现在循环前” 这种情况;
所以说,目标高度 a1 可能出现在循环开始前,也可能出现在循环节中,也可能不出现;
这样的话,就得分类讨论;
在紧接着的 2m 次操作中,有如下几种可能:
(1)a1 未出现或者 a2 未出现
(2)a1 和 a2 都出现在了循环开始前
(3)a1 出现在了循环开始前,a2 在循环节中
(4)a2 出现在了循环开始前,a1 在循环节中
(5)a1 和 a2 都出现在了循环节中
对于情况 (1)、(2)、(3)、(4) 都很好处理,主要是情况 (5) 如何判断是否有解以及如何求出最小的整数解;
下面主要谈谈我对情况(5)的处理;
设 p1 表示 a1 第一次出现时进行的操作次数,p2 表示 a2 第一次出现时进行的操作次数;
d1 表示 a1 所在循环节的长度,d2 表示 a2 所在循环节的长度;
判断是否有相同的操作次数,使得 h1 变为 a1,h2 变成 a2,可以转化成是否存在 x1,y1 使得等式
p1+x1d1=p2+x2d2 成立;
哇,这不就是拓展欧几里得么;
问题到这就算是搞定了,如果你不会拓展欧几里得算法,可以看一下我的这篇博客(打个小广告,哈哈哈)
•Code
D.Mike and Feet(单调栈)
•题意
有 n 个数,分别表示为 a1,a2,⋯,an;
定义 fi 表示对于任意长度为 i 的连续的区间,都有个区间最小值,求这些区间最小值中的最大值;
输出 n 个数,分别表示 f1,f2,⋯,fn;
•题解
对于任意一个数 ai,求出以 ai 为最小值的最大区间,这个可以用单调栈 O(n) 求出;
求出后,按照 ai 降序排列,优先将 ai 大的所包含的区间输出;
•Code
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· What?废柴, 还在本地部署DeepSeek吗?Are you kidding?
· 程序员转型AI:行业分析
· 深入集成:使用 DeepSeek SDK for .NET 实现自然语言处理功能
· 为DeepSeek添加本地知识库
· .NET程序员AI开发基座:Microsoft.Extensions.AI
2018-09-19 2018青岛网络预选赛 B."Red Black Tree"(LCA+二分答案)
2018-09-19 AC自动机
2018-09-19 Benelux Algorithm Programming Contest 2017(D)
2018-09-19 BAPC2017