【题解】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)\) 。