AT_agc050 总结

news/2025/11/20 21:18:39/文章来源:https://www.cnblogs.com/water-flower/p/19249590

久违地发一次考试总结。因为这次写的比较详细,勉强能拿出来看看。

A

第一反应是线段树。(其实按位考虑说不定对于某些题也是一种突破口)

正解是连 \((2*p)-1\bmod n+1)\)\((2*p+1)-1\bmod n+1\)

然后发现对于每个点的(虚)子树内,叶子节点的个数就够了。线段树内横向走编号是 +1

超级神秘结论好题。

B

max:一个套路是考虑最后一步。

但是我感觉也不好做 ba

对我的启示是可以手玩一下,把某种操作转成另外一种操作。

对于这个题,可以发现我们可以另一个点平移三格,然后发现可以用添加和平移操作来等效替代删除操作,然后平移就较为好统计?

可以把三个散点当成最后一步,然后区间 dp 中间的空隙。

C

博弈策略显然,充要条件也比较容易发现:不存在一对相邻 B 中间 S 个数的 log 向上取整大于后面 B 的个数。

然后可以容斥一下变成统计小 B 失败的方案数,这一步很有启发性,因为存在一个地方合法比较麻烦,但是任意地方都不合法是较为好维护的。

可以维护 cntB - log S,但是仔细一想发现比较唐,这种太猎奇的状态可能反而不好转移,所以可以改成直接记 cntB,然后转移一个后缀。

直接转移其实还是有点麻烦,可以考虑钦定这个位置 i 必须填 B,这样还方便统计答案。

感觉这个题要做出来需要很好的 dp 基本功,这正是我欠缺的。

D

也是一个比较考察 dp 基本功的题目。

是不是这种填表的题目用记忆化比较好写?

比较重要的信息有:现在是第几轮(c),干掉了几个人(j),当前在什么位置(i)。比较神奇的是,这个题还需要记录一个变量 l 表示想要统计答案的人在什么位置。

比较特别的是这个第四个状态维度,这启示我们对于状态相同但是答案不同的点,可以多记录一位来表示我们关注的点在什么位置。

还有一个需要注意的是,j 和 l 记录的都是相对于第一个人的位置,这是因为那些被干掉的人我们不关心,所以可以直接删掉。

想清楚了后似乎转移较为朴素。

还有一个启示是概率期望题要多手玩小数据来体会。

似乎有一个套路是如果不在乎轮数,可以认为每进行一次操作后,都循环移位一次,这样可以不记录 i 这一维。

E

牛逼题,详细写一下题解。这篇题解主要是对重开之星的题解的补充。

稍微转化一下后,可以认为题目在求:

\[f(p_1,r_1,p_2,r_2,p_3,r_3) = \sum_{x=0}^{p_1p_2p_3-1}[x\bmod p_1\le r_1,x\bmod p_2 \le r_2,x\bmod p_3\le r_3] \]

如果是等于号,那就是我们熟悉的 CRT,但可惜不是。不过可以先分析一下等于号,找一下性质。毕竟只有三个限制说不定能有比较好看的形式呢?

\[x = b_1+k_1 p_1\\ x = b_2+k_2 p_2\\ x = b_3+k_3 p_3\\ \]

首先上下相减后用裴蜀定理,容易得到:

\[b_1 = b_2 + k_2\gcd(p_1,p_2)\\ b_1 = b_3 + k_3\gcd(p_1,p_3)\\ \]

(注:这里的 \(k\) 和上面的 \(k\) 毫无关系,只是因为我比较喜欢写成不定方程的形式)

如果枚举了合法的 \(b_1\),那么就可以快速计算出 \(b_2\)\(b_3\),因为它们是周期性出现的。(周期是 \(\gcd(p_1,p_2)\)\(\gcd(p_1,p_3)\)

发现若直接把 \(\operatorname{lcm}(\gcd(p_1,p_2),\gcd(p_1,p_3))\) 当成一个大周期,就会发现在每个大周期之间的 \(b_2\)\(b_3\) 出现次数是相同的。

为了方便表示,设 \(V=\operatorname{lcm}(\gcd(p_1,p_2),\gcd(p_1,p_3))\),若 \(p_1\neq V\),则可以递归到 \((r_1/V)\times f(V,V-1,p_2,r_2,p_3,r_3)\)\(f(V, r_1\bmod V,p_2,r_2,p_3,r_3)\) 两个子问题上了。

对于 \(p_2\)\(p_3\) 显然也可以进行这样的操作来递归子问题,递归三次之后就都满足了。画一个质因数的维恩图帮助理解:

相当于每次是保留了阴影部分,然后叉掉与另外两个无交的部分。

最后相当于就剩了个这个东西下来,可以感受到这玩意的性质肯定不一般,

标注一点字母方便表述:

也就是说可以设

\[p_1 = xyg\\ p_2 = xzg\\ p_3 = yzg \]

终于出现这种乘法的形式了,不妨让 \(x\ge y\ge z\),因为 \(p_1\le 1e12\)\(p_1 \ge xy\),这就是一个标准的根号分治的形式,所以 y 小于 \(1e6\),同理 z 小于 \(1e6\).

考虑 \(p_1\)\(\operatorname{lcm}(p_1,p_2)\) 只差 \(z\) 倍,\(p_2\)\(\operatorname{lcm}(p_1,p_2)\) 只差 \(y\) 倍,可以从这里入手。

可以维护两个区间 \([0,r_1]\)\([0,r_2]\),第一个区间每次跳 \(p_1\) 个单位长度,第二个区间每次跳 \(p_2\) 个单位长度,每次区间的交就是对于 \(p_1,p_2\) 同时合法的区间,然后再 \(O(1)\) 计算这个区间对 \(p_3\) 的合法长度(这个是简单的)。对于这两个区间,每次找到末端靠前的那个跳,就能维护出所有对于 \(p_1,p_2\) 同时合法的区间,统计一下对于 \(p_3\) 的答案就做完了。

这个题给我们的一个很重要的启示是数论题可以通过画质因子的维恩图来辅助理解。

:::info[Click to see My Code]

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128 LL;
const int mod=998244353;
inline ll read() {ll x = 0; bool f(0); char ch = getchar();while(!isdigit(ch)) f = (ch == '-'), ch = getchar();while(isdigit(ch)) x = (x<<3) + (x<<1) + (ch^48), ch = getchar();return f ? -x : x;
}
inline void wt(ll x, bool md = 1) {//fl=1是换行,fl=0是空格if(x < 0) x = -x, putchar('-'); static short Stack[64], top(0);do Stack[++ top] = x % 10, x /= 10; while(x);while(top) putchar(Stack[top--] | 48);md ? putchar('\n') : putchar(' ');
}
#define  For(i, s, e) for(int i = s; i <= e; ++i)
#define ifor(i, s, e) for(int i = s; i >= e; --i)
#define pb push_back
struct def{int x;inline operator ll() {return x;}inline def (ll val=0) : x(val) {} // ?inline def operator + (def v) {return {x + v.x >= mod ? x + v.x - mod : x + v.x};}inline def operator - (def v) {return {x - v.x < 0 ? x - v.x + mod : x - v.x};}inline def operator * (def v) {return {1ll * x * v.x % mod};}inline void operator +=(def v) {x = x + v.x >= mod ? x + v.x - mod : x + v.x;}inline void operator -=(def v) {x = x - v.x < 0 ? x - v.x + mod : x - v.x;}inline void operator *=(def v) {x = 1ll * x * v.x % mod;}
};
struct lim{LL p, r; void out() {wt(p, 0), wt(r);}};
LL gcd(LL a, LL b) {return b ? gcd(b, a % b) : a;}
LL lcm(LL a, LL b) {return a / gcd(a, b) * b;}
def get(LL x, lim tr) {return def((x / tr.p * (tr.r + 1) + min(tr.r, x % tr.p) + 1) % mod);} // mind these +1
def fun(lim a, lim b, lim c);
def calc(lim a, lim b, lim c) {def tmp;tmp = fun(a, b, c); if(tmp != -1) return tmp;tmp = fun(b, c, a); if(tmp != -1) return tmp;tmp = fun(c, a, b); if(tmp != -1) return tmp;if(a.p > b.p) {swap(a, b);}if(b.p > c.p) {swap(b, c);} if(a.p > c.p) {swap(a, c);} // LL g = gcd(gcd(a.p, b.p), c.p), y = gcd(a.p, c.p) / g, x = gcd(a.p, c.p) / g, z = gcd(b.p, c.p) / g; LL k = x * g;  // 好像这些东西都用不到?只是用来分析复杂度的?ll s1 = 0, e1 = a.r, s2 = 0, e2 = b.r; def res;while(1) {if(s1 == s2 && s1 % c.p == 0 && s1) break; // ensure this is a periodll l = max(s1, s2), r = min(e1, e2);if(l <= r) res += get(r, c) - get(l-1, c);if(e1 < e2) s1 += a.p, e1 += a.p;else s2 += b.p, e2 += b.p;}return res * def(a.p * b.p / s1 * c.p % mod);
}
def fun(lim a, lim b, lim c) {LL v = lcm(gcd(a.p, b.p), gcd(a.p, c.p));if(a.p == v) return -1;return def(a.r / v % mod) * calc({v, v-1}, b, c) + calc({v, a.r % v}, b, c);
}
int main() {// freopen("file.in","r",stdin);// freopen("file.out","w",stdout);lim tr[3];For(i, 0, 2) {ll g = read(), r = read();tr[i].p = g + r, tr[i].r = g - 1;}wt(calc(tr[0], tr[1], tr[2]));return 0;
} 

:::

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

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

相关文章

补 二分法与图

题目:洛谷p1462 只要某个性质具有单调性,就必然可以二分。 以最短路为判断条件,二分费用,只允许使用费用小于等于目前费用的节点,求最短路,看是否可行,再根据可行性二分费用,最后求出费用的最小值 K 越大,可行…

SpringSecurity 集成 CAS Client 处理单点登录 - Higurashi

推荐阅读:CAS 单点登录详细流程背景 当前业务系统基于 Spring Security,现在需要集成 CAS,当用户访问业务系统时,如果用户没有登录,则跳转到 CAS Server 统一登录页面完成登录。 而当用户从 CAS Server 退出登录后…

NOIP2025模拟赛12(炼石计划NOIP模拟赛第 19 套题目)

赤了这口魔拟赛的石!写在前面: 我艹了何意味啊何意味T1放依托定理的板子题然后我还没听过这个定理(虽然据说是数论基础四大定理之一,但是好像学习数论基础的时候根本没看到过这个定理也没做过相关的题😡😡😡…

[nanoGPT] GPT模型架构 | `LayerNorm` | `CausalSelfAttention` |`MLP` | `Block` - 实践

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

duckdb索引介绍

duckdb支持的索引类型 duckdb支持两种索引:Min-Max Index (Zonemap)和Adaptive Radix Tree (ART)。前者所有通用数据类型(general-purpose data types,也就是常用的数据类型如varchar/integer/date等,非通用类型指的…

25.11.20 最长不升序列LNIS和最长升序列LIS

LNIS 1.处理一个数时: 如果这个数小于等于当前序列的最后一个数,则直接接在后面,ct++ 反之,从序列头开始寻找第一个比这个数小的数并且替代他,目的:使这个序列更容易接后面的数 2.代码模板 int LNIS(vector&…

2025.11.20 B 题解

感觉其实今天 \(B\) 是最有趣的,难度估在上位紫吧。一眼数学,两眼不是数学,三眼发现可以让 \(x\) 向 \((dx+t)\bmod n\ (t\in[L,R])\) 连边,然后从每个 \(x\) 找到到根最短路径。对于每个给出的 \(x\),它所覆盖的…

重组干扰素蛋白的结构特点与分子性质综述

一、干扰素的类别与基础结构特征 干扰素(interferon,IFN)是一类具有典型结构模式的小分子蛋白,在哺乳动物中广泛表达,其最显著的特征是以折叠紧凑的 α 螺旋结构或二聚体结构实现分子稳定性。按照分子结构、序列特…

2025 门窗十大品牌权威榜单:依托行业评估报告 + 选购白皮书,省心采购指南!

本次 2025 年门窗十大品牌筛选工作,以中国建筑金属结构协会重磅发布的《2025 年度建筑门窗行业发展评估报告》为核心数据支撑,深度拆解报告中关于行业技术趋势、品牌综合竞争力、产品性能核心指标等关键内容,同时整…

实用指南:OpenCV下载安装教程(非常详细)从零基础入门到精通,看完这一篇就够了(附安装包)

实用指南:OpenCV下载安装教程(非常详细)从零基础入门到精通,看完这一篇就够了(附安装包)2025-11-20 21:08 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !impo…

详解 DPO

DPO 隐式地优化了与现有 RLHF 算法(基于 KL 散度约束的奖励最大化)相同的目标函数。然而,与传统 RLHF 方法(需要首先训练一个独立的奖励模型,然后通过强化学习来优化策略)不同,DPO 推导并提出了一种直接利用人类…

程序员手记

Linux 终端快捷键 光标移动快捷键作用crtl+a 移动到开头crtl+e 移动到结尾alt+b 向左移动一个单词alt+f 向右移动一个单词crtl+b 向左移动一个字符crtl+f 向右移动一个字符esc+b 向左移动一个单词esc+f 向右移动一个单…

Object.entries() 和 Object.formEntries()的用法详解

Object.entries() 该方法返回一个由对象自身可枚举属性的键值对组成的二维数组,每个子数组形式为 [key, value],顺序与 for...in 循环一致,但不会遍历原型链上的属性。若输入是数组,键会被转换为字符串索引(如 [0…

详细介绍:MyBatis 与 Spring Data JPA 核心对比:选型指南与最佳实践

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

详细介绍:【从0开始学习Java | 第23篇】动态代理

详细介绍:【从0开始学习Java | 第23篇】动态代理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

安卓中执行 root 命令

object SuShell {private const val SU_CMD = "su"fun exec(cmd: String): Result<String> {val process = Runtime.getRuntime().exec(SU_CMD)val writer = process.outputStream.bufferedWriter()wr…

UniApp缓存系统详解 - 详解

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

FreeSWITCH使用mod_fail2ban模块来提升安全

FreeSWITCH使用mod_fail2ban模块来提升安全操作系统:Debian 12.5_x64 FreeSWITCH版本: 1.10.11 fail2ban版本: 1.1.0 nftables版本: 1.0.6 FreeSWITCH系统部署在公网,大概率会碰到恶意注册,今天整理下debian12环…

【ArcMap】使用拓扑(Topology)检查线是否存在断点

拓扑必须在地理数据库中创建,Shapefile无法创建拓扑。 第一步:创建要素数据集在 Catalog 窗口中,右键点击地理数据库(.gdb),没有就新建一个数据库。选择 新建(New) -> 要素数据集(Feature Dataset)。在弹…