THUPC部分题解

THUPC2023初赛

B. 拧螺丝

  • 考虑如何暴搜,从最终状态只有唯一的 n n n 倒序还原回去,相当于不断执行以下操作直到没有螺丝:
    1. 执行以下操作 k k k 次:
      • 找到当前含有最多螺丝的工件,将螺丝数减一
    2. 将当前含有最多螺丝的工件复制一份
  • f k ( n ) f_k(n) fk(n) 表示参数为 ( n , k ) (n,k) (n,k) 的答案,查询 OEIS 可知 f k ( 1 ) = 1 , f k ( n ) = ⌈ ∑ i = 1 n − 1 f k ( i ) k − 1 ⌉ ( n > 1 ) f_k(1) = 1, f_k(n) = \lceil \frac{\sum \limits_{i = 1}^{n - 1}f_{k}(i)}{k - 1} \rceil(n > 1) fk(1)=1,fk(n)=k1i=1n1fk(i)(n>1),压位高精实现即可。
  • Code

C. 快速 LCM 变换

  • v p ( A ) v_p(A) vp(A) 表示 A A A 的质因数分解中 p p p 的次数,设 M ( p ) = max ⁡ 1 ≤ i ≤ n { v p ( a i ) } = v p ( a x ) M(p) = \max\limits_{1\le i\le n}\{v_p(a_i)\} = v_p(a_x) M(p)=1inmax{vp(ai)}=vp(ax), m ( p ) = max ⁡ 1 ≤ i ≤ n , i ≠ x { v p ( a i ) } = v p ( a y ) m(p)=\max\limits_{1\le i\le n,i\not = x}\{v_p(a_i)\} = v_p(a_y) m(p)=1in,i=xmax{vp(ai)}=vp(ay)

    • M ( p ) ≠ m ( p ) M(p) \not = m(p) M(p)=m(p),则当 a x a_x ax 被选择时会使 LCM 乘上 1 p M ( p ) − m ( p ) \frac{1}{p^{M(p) - m(p)}} pM(p)m(p)1,否则 LCM 不变。
    • M ( p ) = m ( p ) M(p) = m(p) M(p)=m(p),则当 a x a_x ax a y a_y ay 同时被选择时会使 LCM 乘上 p v p ( 2 p M ( p ) ) − M ( p ) p^{v_p(2p^{M(p)})-M(p)} pvp(2pM(p))M(p),否则 LCM 不变。
  • 进一步分析,设 P P P 为质数集合,原序列的最小公倍数为 L C M 0 LCM_0 LCM0,令
    f ( a i ) = ∏ p ∈ P p [ v p ( a i ) = M ( p ) ] ( m ( p ) − M ( p ) ) g ( a i + a j ) = ∏ p ∈ P p [ v p ( a i ) = M ( p ) ] [ v p ( a j ) = M ( p ) ] ( v p ( 2 p M ( p ) ) − M ( p ) ) = ∏ p ∈ P p max ⁡ { v p ( a i + a j ) − M ( p ) , 0 } f(a_i) = \prod\limits_{p\in P}p^{[v_p(a_i)=M(p)](m(p)-M(p))}\\ g(a_i+a_j)=\prod\limits_{p\in P}p^{[v_p(a_i)=M(p)][v_p(a_j)=M(p)](v_p(2p^{M(p)})-M(p))}=\prod\limits_{p\in P}p^{\max\{v_p(a_i+a_j)-M(p),0\}} f(ai)=pPp[vp(ai)=M(p)](m(p)M(p))g(ai+aj)=pPp[vp(ai)=M(p)][vp(aj)=M(p)](vp(2pM(p))M(p))=pPpmax{vp(ai+aj)M(p),0}

  • 则答案可表示为:
    L C M 0 ( ∑ 1 ≤ i < j ≤ n f ( a i ) f ( a j ) g ( a i + a j ) ) LCM_0 \left(\sum \limits_{1\le i < j\le n}f(a_i)f(a_j)g(a_i+a_j)\right) LCM0(1i<jnf(ai)f(aj)g(ai+aj))

  • 由于结果仅和 a i , a j , a i + a j a_i,a_j,a_i+a_j ai,aj,ai+aj 有关,考虑生成函数 F ( x ) = ∑ i = 1 n f ( a i ) x a i F(x)=\sum \limits_{i = 1}^{n}f(a_i)x^{a_i} F(x)=i=1nf(ai)xai,不难将答案表示为:
    L C M 0 ( ∑ v [ x v ] ( 1 2 ( F 2 ( x ) − ∑ i = 1 n f 2 ( a i ) x 2 a i ) ) g ( v ) ) LCM_0\left(\sum\limits_{v}[x^v]\left(\frac{1}{2}(F^2(x)-\sum\limits_{i = 1}^{n}f^2(a_i)x^{2a_i})\right)g(v)\right) LCM0(v[xv](21(F2(x)i=1nf2(ai)x2ai))g(v))

  • 直接对 F ( x ) F(x) F(x) 做多项式乘法即可,时间复杂度 O ( ( n + max ⁡ 1 ≤ i ≤ n { a i } ) log ⁡ max ⁡ 1 ≤ i ≤ n { a i } ) ) \mathcal O((n + \max\limits_{1\le i \le n}\{a_i\})\log \max\limits_{1\le i \le n}\{a_i\})) O((n+1inmax{ai})log1inmax{ai}))

  • Code

L. 最后的活动

  • f k , i , s f_{k,i,s} fk,i,s 表示距离目标分数为 k k k 分时、当前在第 i i i 层、前 i − 1 i - 1 i1 层获得的评价状态为 s s s 的最大概率, k k k 从小到大枚举,而 i i i 从大到小枚举,转移方程较多这里不再详细列举。
  • 对于固定的 k k k,注意到若 c ′ = 0 c'=0 c=0,任意的 f k , i , s f_{k,i,s} fk,i,s 都可由 f k , 1 , 0 f_{k,1,0} fk,1,0 转移来,进一步地,任意的 f k , i , s f_{k,i,s} fk,i,s 表示为 f k , 1 , 0 f_{k,1,0} fk,1,0 的一次函数(系数非负)和 max ⁡ \max max 的嵌套形式,用常规化的迭代法相当麻烦,考虑二分 f k , 1 , 0 f_{k,1,0} fk,1,0,若迭代后求得的 f k , 1 , 0 ′ > f k , 1 , 0 f'_{k,1,0} > f_{k,1,0} fk,1,0>fk,1,0 则说明真实的 f k , 1 , 0 f_{k,1,0} fk,1,0 应当更大些。
  • Code

你可能感兴趣的:(算法)