有意思一点的题:
- 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})。答案即为
考虑如何求(sum limits_{j = 0} ^ {c_i} p_i^j)这块,用等比数列求和?无法取膜。
设( ext{sum}(p,c))为(sum_{i = 0} ^ c p^i)
分治计算即可,对于那个分治的式子,应该有点数学素养就推出来了吧(
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)