2020.12.12 刷题总结
有意思一点的题:
- ACWing 97 约数之和(Sumdiv)
- ACWing 98 分形之城(Fractal Streets)
- ACWing 100 \(\text{IncDec}\)序列
ACWing 97 约数之和(Sumdiv)
求\(A^B\)的约数和,对\(9901\)取膜。
爆算显然不行,我们考虑将\(A\)分解质因数成\(p_1^{c_1}p_2^{c_2}\cdots p_n^{c_n}\),那么\(A^B = p_1^{Bc_1}p_2^{Bc_2}\cdots p_n^{Bc_n}\)。答案即为
考虑如何求\(\sum \limits_{j = 0} ^ {c_i} p_i^j\)这块,用等比数列求和?无法取膜。
设\(\text{sum}(p,c)\)为\(\sum_{i = 0} ^ c p^i\)
分治计算即可,对于那个分治的式子,应该有点数学素养就推出来了吧(
ACWing 98 分数之城(Fractal Streets)
这题要命。
求\(A,B\)在\(N\)等级下的坐标,然后用欧几里得距离计算即可。
考虑问题为\(\text{calc}(A,B,N)\),先算出\(\text{calc}(A,B,N - 1)\),然后:
考虑对于某一点坐标\((x,y)\)
- 如果在\(N\)等级的左上角,相当于先顺时针旋转\(90\)度,然后再水平翻转。
我们小学二年级的时候就学过任意坐标的旋转,若一个点绕原点旋转\(\theta\)度后的坐标为
\[(x,y) \cdot \left[ \begin{matrix} \cos{\theta} & \sin{\theta}\\ -\sin{\theta} & \cos{\theta}\\ \end{matrix} \right] \]旋转后得\((-y,x)\),翻转后得\((y,x)\)。
- 如果在\(N\)等级的左下角,相当于先逆时针旋转\(90\)度(顺时针旋转\(270\)度),然后再水平翻转。
而且因为在下方,还需要进行一系列加,所以得\((2^N - y + 1,2^{N - 1} - x + 1)\)。 - 如果在\(N\)等级的右上角,得\((x,y + 2^{N - 1})\)
- 如果在\(N\)等级的右下角,得\((x + 2^{N - 1},y + 2^{N - 1})\)
分治即可。
ACWing 100 \(\text{IncDec Sequence}\)
这题没有秒,悲。
建立差分数组\(b_i = a_i - a{i - 1}\)。考虑所有数都一样的要求,即对于\(2 \le i \le n\),\(b_i = 0\)。第二个询问即为进行操作后的\(q_1\)的值域大小。
那么问题就变为了修改\(b_2,b_3,\cdots b_n\),使其全为\(0\)。
变换方式:
- \(b_i,b_j\),如果\(b_i,b_j\)一正一负就正好,最优。
- \(b_1,b_i\) 如果没有第一种修改方式合法的了,那么可以选择这种,因为修改\(b_1\)不影响合法性。
- \(b_1,b_{n + 1}\) 同第二种
设\(cnt_1\)为所有\(b_i > 0\)的\(b_i\)和,\(cnt_2\)为所有\(b_i < 0\)的\(|b_i|\)和。
那么使用第一种方法显然为\(\min(cnt_1,cnt_2)\)次。
使用二三种方法显然为剩下来的,即为\(|cnt_1 - cnt_2|\)次。
那么第一问就是\(\min(cnt_1,cnt_2) + |cnt_1 - cnt_2| = \max(cnt_1,cnt_2)\)。
第二问显然是使用第二种变换方式的次数的方案数,即为\(|cnt_1 - cnt_2| + 1\)(因为可以不使用方案2所以要+1)