CF1603D Artistic Partition 题解

\(2^k>n\) 时,可以令 \(x_i\leftarrow 2^{i-1}-1\ (i\le k)\),此时答案为 \(n\),因为任意一个区间 \([x_i+1,x_{i+1}]\) 都满足 \(2(x_i+1)>x_{i+1}\),而 \(n\) 是最小的可能的答案。

考虑 \(\tt DP\),设 \(f_{i,j}\) 表示只考虑前 \(j\) 个数,已经分了 \(i\) 段的最小值。转移方程:\(f_{i,j}=\min\limits_{1\le k< j}f_{i-1,k}+c(k+1,j)\)

考虑用线段树对转移式进行维护。首先枚举 \(i\),初始化线段树,然后再枚举 \(j\),当 \(j\) 增大时对于 \(j\) 的每个因子 \(k\) 用容斥求出 \([k,j]\) 内与 \(j\) 的最大公约数为 \(k\) 的数的个数,更新线段树。

随便推一下就可以得到 \([l,r]\) 内与 \(r\) 的最大公约数为 \(l\) 的数的个数是:

\[\sum_{i|r,l|i}\frac{r}{i}\cdot\mu(\frac{i}{l}) \]

时间复杂度 \(O(n\log^3n)\),需要卡常。

代码:https://codeforces.com/contest/1603/submission/224744941

posted @ 2023-09-24 09:50  zifanwang  阅读(4)  评论(0编辑  收藏  举报  来源