2025暑假训练赛1
ABC217G
https://atcoder.jp/contests/abc217/tasks/abc217_g
有dp,直接推式子,二项式反演等多种做法。
要考虑到分组不是排列,因为每组是相等的。然而状态设计是 \(f[i]\) 表示 \(n\) 个数分为 \(i\) 组的不同的方案数,直接组合数做会使状态内包含重复状态,所以转化为排列去做,最后再乘以 \(inv[k]\) 变为组合。观察到会有空的组,而所求答案为非空组g[i],两者关系为 \(f[i] = \sum g[k]\times C[i][i-k]\) ,这个式子可以先求f用二项式反演求g,而如果想到式子 \(g[i] = f[i] - \sum C[i][k]\times g[k]\) 就不用反演了,区别在于从答案出发还是从已有条件出发。
dp就是可递推性可以做。
ABC217F
https://atcoder.jp/contests/abc217/tasks/abc217_f
一眼区间dp,状态设计有了,但是不会转移。
感觉这类问题的思想一般是得钦定状态和转移方式,使得dp不重不漏。像这种区间括号问题,一般是钦定第一个括号左端为l(定),右端为r(动),遍历来求方案数和。
看题解做法才联想到经典括号问题,唐完了。
ABC222G
https://atcoder.jp/contests/abc222/tasks/abc222_g
看到这类问题去转化数的形式(具体看题解),可以把原问题变为求 \(10^n \equiv 1\ mod\ M'\) 的问题,这时可以根据欧拉定理 \(10^{\phi(M)} \equiv 1\ mod\ M (gcd(10, M) = 1 否则无解)\) 求出phi(M),这里求的其实是10在模M意义下的阶,答案必然是 \(\phi(m)\) 的因数。这可以反证法证明。
这题也可以使用Baby Step Giant Step(BSGS)做,还没学。
CF632F
https://codeforces.com/problemset/problem/632/F
很有意思的一个题,性质很妙,理解了蛮久。
首先要迭代推式子,把条件转化为 \(a[i][j] <= max(a[i][k1], a[k1][k2]..., a[km][j])\) 那么就知道必须不大于任意 i 到 j 路径上的最大值,可以转化为不大于 i 到 j 路径上最小的最大值,记为 B[i][j] 。然而 \(B[i][j] \geq a[i][j]\) ,故可知 \(B[i][j]=a[i][j]\)。
考虑如何求 B 数组。可以利用最小生成树的最小瓶颈路的性质。此时可以 \(O(nlogn)\) 用 kruskal 维护做。但是可以更优,复杂度瓶颈在于求出最小生成树以后要求 B[i][j], 假设 x 为 x,y 中深度较大的点,他们合法当且仅当 \(a[x][y] = max(a[fa[x]][x], a[fa[x]][y] = B[x][y]\) 。
bonus:这题也可以 bitset 暴力卡过去。
ABC212G
https://atcoder.jp/contests/abc212/tasks/abc212_g?lang=en

浙公网安备 33010602011771号