2020.12.12 刷题总结

有意思一点的题:

  • ACWing 97 约数之和(Sumdiv)
  • ACWing 98 分形之城(Fractal Streets)
  • ACWing 100 ( ext{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})。答案即为

[prod_{i = 1} ^ n sum_{j = 0} ^ {c_i} p_i^j ]

考虑如何求(sum limits_{j = 0} ^ {c_i} p_i^j)这块,用等比数列求和?无法取膜。

( ext{sum}(p,c))(sum_{i = 0} ^ c p^i)

[ ext{sum}(p,c) = egin{cases} 0 & p = 0\ 1 & c = 1\ (p^{(c + 1) / 2} + 1) imes ext{sum}(p,(c - 1) /2) & p 为奇数\ (p^{c / 2} + 1) imes ext{sum}(p,c / 2 - 1) + p^c & p 为偶数\ end{cases} ]

分治计算即可,对于那个分治的式子,应该有点数学素养就推出来了吧(

ACWing 98 分数之城(Fractal Streets)

这题要命。
(A,B)(N)等级下的坐标,然后用欧几里得距离计算即可。

考虑问题为( ext{calc}(A,B,N)),先算出( ext{calc}(A,B,N - 1)),然后:
考虑对于某一点坐标((x,y))

  • 如果在(N)等级的左上角,相当于先顺时针旋转(90)度,然后再水平翻转。

我们小学二年级的时候就学过任意坐标的旋转,若一个点绕原点旋转( heta)度后的坐标为

[(x,y) cdot left[ egin{matrix} cos{ heta} & sin{ heta}\ -sin{ heta} & cos{ heta}\ end{matrix} ight] ]

旋转后得((-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 ( ext{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)

原文地址:https://www.cnblogs.com/luyiming123blog/p/14127269.html