Examples

2023-4-20 #49 被赋予的是福祉亦或是灾厄

——Evalia《黑花鸢尾之歌》

省选名单公示出了,暂时没退役。

省选打成这个鬼样子太丢人了,希望能攒点人品给国赛。


补一下之前欠的两道题:2022-12-15 #13 放眼望去 无论是哪一颗星星 都比自己美丽

71 CFgym104053F Equations

不会做,数论好难啊,感谢裙友教我。

注意到 f(a,b,m)a,m 的地位是大致等价的,因为其对应二元不定方程 ax+my=bx 最小自然数解。

我们想交换两维,这样我们可以应用 f(amodm,b,m)=f(a,b,m) 使得枚举量降到 O(a),于是我们对称地考察 y 最小自然数解,即 f(m,b,a)

f(a,b,m)=x0,f(m,b,a)=y0

若方程无 x,y 均非负整数解,其一定满足:

ax0+my0=b+lcm(a,m)

证明:不妨考虑 gcd(a,m)=1 的情况,取到 y=y0x 为负数,而 y=y0a<0x 一定为正。两者只差一个调整单位(y 减去 ax 加上 m),因此此时 x 为最小自然数解 x0,即 ax0+m(y0a)=b

枚举 i0=imoda,那么容易计算出 y0,若满足上述条件,则有:

x0=b+lcm(a,i)iy0a

由于 i=ka+i0gcd(a,i) 不会变,因此合法 x0 是一个等差数列,容易计算。

不满足上述条件时至少有 iy0b,若 y0>0,我们暴力枚举 i 直到其满足条件,枚举量是 O(a×ba=b) 的。

y0=0,则 x0=bamodigcd(i,a),枚举 i0gcd(i,a) 固定,取模转整除做整除分块就好了。

复杂度 O(VlogV)V=max(a,b))。

72 CFgym104053K Middle Point Graph

题意就是让我们考虑特殊几何结构的共面,讨论一下。

  • 无中点:共面概率为 0
  • 一个中点:选择这条边对应两个顶点,那么另一个顶点可以任选。
  • 两个中点:
    • 选择一条边以及其两个顶点,再任选一条边;
    • 选择一个三元环上两个点以及上面两条边,注意不能和上面重复,因此我们只能选择两条共顶点的边以及非公共顶点的两个顶点;
  • 三个中点:三元环的三条边以及上面一个点;
  • 四个中点:四元环。

三元环和四元环计数都是 O(mm) 的。

295 2022 集训队互测 Round 11 C 卡牌游戏

好难啊,有点像 CF1768F Wonderful Jump,但我还是不会。

先做没有禁用的情况。

直接 dp 是 O(n2) 的。

注意到 Slcm(a,b)×lcm(a,b) 要么是 0,要么在 [S2,S] 内,因此选择的两个数之间小于根号的数不会超过 3 个。

自然地引出了根号分治,若转移的两个位置中有小于根号的数,我们在这一边枚举另一边可以做到 O(n)(每个位置只会被 O(1) 个小于根号的数枚举到)。

若两个数均大于根号,我们可以暴力枚举其倍数,并钦定这个数为 lcm 进行转移(枚举到的不是 lcm 一定不优)。

加上禁用,上述两种情况仍然可以类似处理,会得到一个“[l,r] 内答案对 vmax”状物,可以使用 ST 表/猫树做到 O(1) 修改 O(nlogn) 整体计算出答案(注意还可以所有数都在前面,或都在后面)。

复杂度 O(nn)

296 CF1810H Last Number

什么结论!!

一个关键的切入点是找到第一次满足 maxminmin 的时刻,容易发现之后一定满足,而且操作形如将最小值修改为新的数,最大值删除。

官方题解证明了,对于时刻 i,删去的最大值一定是 niϕ

于是可以二分算出这个时刻 t(注意这里容易爆精度),也可以直接计算。

那么 t 时刻的最小值一定是 t,其余数则是 nt+1nϕ,问题变为计算:

i=t+1n(1)ni(niϕ)

按照 ni 的奇偶性分类,问题变成了类欧的经典形式,但分母是一个无理数,我们可以用分数 AB 拟合出一个精度较高的 ϕ 进行计算。

复杂度 O(Tlogn)

另一个做法摆了。

297 CF1804G Flow Control

比较简单?

加入删除直接扫描线,考虑用户构成相同的一段怎么计算。

操作相当于整体加,整体除,根据 loj#6029. 「雅礼集训 2017 Day1」市场 的经验,我们可以尽可能暴力地维护这一过程直到贡献形式容易刻画。

暴力模拟区间加,区间除的过程直到遇到循环,这里的复杂度分析仍然能套用上面那题的均摊。

复杂度 O(n(logn+logV))

298 CF1804H Code Lock

很神秘的题。

很容易发现串是没有用的,我们只用得知任意两个字母之间来回的次数。

先考虑 k 为偶数的情况,考虑拆贡献,我们发现一对相对的边的经过次数相较于一条边的经过次数更容易刻画,其经过次数和一定是跨越两个半圆的字母对数量。

我们枚举所有大小为 k2 的集合 s 作为初始集合,考虑类似旋转卡壳地移动一对边(一加一删)来遍历每个半圆并 dp 出答案。内部可以继续使用一个状压 dp 来记录哪些边状态与初始状态不同,转移 O(k) 枚举一下边即可。

上面的 dp 看起来状态数就很少(由于是加一条边删一条边,状压的集合与 s 交的大小只有两种),官方题解说 dp 有效状态数只有 82818450 种。

注意要实现精细一点,比如钦定加入的第一条边是 1,不这样写状态数还会带上 k

k 为奇数做法没有什么不同,可以发现距离为 k2 的边可以代替上面所说的相对边,我们类似地枚举初始集合并加/删边算一下答案即可。

posted @   xiaoziyao  阅读(195)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示