abc212-solution-post

ABC212 Solution

link


C - Min Difference

\(b\) 排序,枚举 \(a\) 数组每个数,直接在 \(b\) 里面 lower_bound 更新答案即可。


D - Querying Multiset

随便怎么写个堆或者平衡树都可以。


E - Safety Journey

\(dp_{x,y}\) 表示走 \(y\) 步到 \(x\) 的方案数。

转移的话把所有不和它断开边的点的 \(dp\) 值加过来就好了。

这个可以优化,我们改成上一层所有 \(dp\) 值的和减去和它断开边的点的 \(dp\) 值。减号前面可以每次记录。

复杂度 \(\mathcal O(nm)\),建议滚掉 \(dp\) 第一维。


F - Greedy Takahashi

记录每趟 bus 走 \(2^k\) 趟 bus 到的 bus,询问直接跳即可。好像要分一些类。


G - Power Pair

先判掉 \(x=y=0\),那么现在 \(x,y\in[1,p-1]\)。设 \(p\) 的一个原根为 \(r\)

因为 \(r^1\sim r^{p-1}\) 不重复地取遍 \(1\sim p-1\)\(p-1\) 个数,对于 \(x,y\),可以找到唯一的 \(a,b\) 满足 \(x=r^a,y=r^b\)

原式化为 \(r^{an}\equiv r^b\pmod p\),即 \(an\equiv b\pmod{p-1}\)

现在要计数满足条件的 \((a,b)\) 使得存在 \(n\) 满足上式。

固定 \(a\),如果 \(\gcd(a,p-1)=1\),满足条件的 \(b\) 显然有 \(p-1\) 个。

否则我们除掉这个 \(\gcd\),满足条件的 \(b\) 的数量当然也要同时除掉这个 \(\gcd\)

那么一个 \(a\) 满足条件的 \(b\) 的数量就是 \(\frac{p-1}{\gcd(a,p-1)}\)

要求的即为

\[\begin{aligned} \sum_{a=1}^{p-1}\frac{p-1}{\gcd(a,p-1)}&=\sum_{d|n}\frac n d\sum_{i=1}^n[\gcd(i,n)=d]\\ &=\sum_{d|n}\frac n d\sum_{i=1}^{\frac n d}[\gcd(i,\frac n d)=1]\\ &=\sum_{d|n}\frac n d\varphi(\frac n d)\\ &=\sum_{d|n}d\varphi(d) \end{aligned}\]

这里的 \(\varphi\) 可以搜索一下递推出来,但是直接根号求也可以过。怎么都比官方题解的 \(\mathcal O(d^2(p-1))\) 快多了。


H - Nim Counting

\(a\) 数组存到桶里,做 \(m-1\) 次自异或卷积得到的常数项即为挑 \(m\) 个数异或和为 \(0\) 的方案数。

现在要求 \(m\)\(1\sim n\) 的方案数和,我们设原多项式(桶)为 \(F\),要求的即为

\[[x^0]\sum_{i=1}^nF^i \]

直接等比数列求和带走就好了(应该?没写)。

posted @ 2024-02-27 20:20  iorit  阅读(57)  评论(0)    收藏  举报