【题解】CF1614 D1 动态规划,数论,gcd

题目链接

\(g_i=\gcd(a_1,a_2,a_3,...,a_i)\)

\(g_i\) 可以分成若干段其中每段的 \(g_i\) 均相等,\([1,pos_1),[pos_1,pos2)...[pos_{m-1},pos_{m})\)

设第 \(k\)\([pos_{k-1},pos_k)\)\(\forall i\in [pos+{k-1},pos_k)\cup Z,g_i=val,f_k\gets val\)

并且因为 \(\gcd(a,b,c)=\gcd(\gcd(a,b),c)\) ,所以 \(f_i|f_{i+1}\)

考虑一个 dp :令 \(dp[d]\) 为考虑所有 \(a\) 中的 \(d\) 的倍数构成的排列,最大价值是多少。

\(cnt[d] \gets \sum _{i=1}^n [d|a_i]\)

因为 \(\gcd(k\times a,k\times b)=k\times \gcd(a,b)\) ,所以所有 \(a\) 中的 \(d\) 的倍数构成的排列的 \(\gcd\) 一定是 \(d\) 的倍数。

对于转移,我们枚举排列的最后一段的 \(f\)

  • 如果最后一段的 \(f=d\) ,考虑枚举倒数第二段, \(k\times d|f\)有转移 :
    • \(dp[d]\gets dp[k\times d] + d\times (cnt[d]-cnt[k\times d])\)
  • 如果最后一段的 \(k\times d | f,k > 1\) ,当且仅当 \(cnt[d] = cnt[k\times d]\) , 有转移 \(dp[d]\gets dp[k\times d]\)

每次转移枚举倍数即可,复杂度 \(O(a_i\ln a_i)\)

代码记录

posted @ 2021-11-27 13:50  Themaxmaxmax  阅读(56)  评论(0编辑  收藏  举报