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號