hdu7217

题面

定义一个序列 \(\{a_1,a_2,...,a_n\}\) 是好的,当且仅当 \(\forall i\in[1,n-1]\)\(a_{i-1}\)\(a_i\) 的约数。

给定 \(n,m\) ,求长度不超过 \(n\) 且 最大元素 \(\le m\) 的好的序列的个数,对 \(10^9+7\) 取模。

数据范围:\(n,m\le 10^9\)

题解

考虑对最大元素是 \(m\) 的好的序列的个数是什么,发现是把其质因数分解成 \(\prod p_i^{c_i}\) ,答案就是 \(\sum_{i=1}^n\prod\binom{c_i+i-1}{i-1}\) ,但是你会发现这个式子被 \(c_i\) 限制死了,完全没有进一步化简的方向,所以考虑换个方向。

其实你只要好好想想这个 \(\prod\binom{c_i+i-1}{i-1}\) ,我们是按 \(d_i=\frac{a_{i}}{a_{i-1}}\) 来对 \(a\) 计数的,那么我们为什么要还要把 \(d_i\) 拆成质因数呢?我们直接设 \(f_{n,m}\) 为当前 \(\prod d_i\le m\) ,且非 \(1\)\(d_i\) 的个数为 \(n\) ,那么最终答案就是

\[ans=\sum_{i=1}^n f_{i,m}\sum_{j=1}^n \binom{j-1}{i-1}=\sum_{i=1}^n f_{i,m}\binom{n}{i} \]

并且 \(f_{n,m}\)\(n\)\(\log m\) 级别的,所以我们只需要快速计算 \(f_{n,m}\) 就可以了。

考虑 \(f_{n,m}\) 的转移,就是枚举下一个 \(d_i\) 是什么,有

\[f_{n,m}=\sum_{i=2}^mf_{n-1,\lfloor\frac{m}{i}\rfloor} \]

熟知数论的同学就会发现,这就是杜教筛的形式,直接整除分块就有 \(O(n^{\frac{3}{4}}\log n )\) 的复杂度,需要卡常。

为什么不能做到 \(O(n^{\frac{2}{3}}\log n)\) 呢?是因为我们没法以 \(O(n)/O(n\log n)\) 的复杂度处理前 \(n\) 项。

那么我们就尝试处理。

要注意杜教筛是处理前缀和的,即 \(f_{n,m}=\sum_{i=1}^mg_{n,i}\),考虑 \(g_{n,m}\) 的含义,就是当前 \(\prod d_i= m\) ,且非 \(1\)\(d_i\) 的个数为 \(n\) 。考虑这玩意的转移式:

\[g_{n,m}=\sum_{i|m} g_{n-1,i} \]

诶,这不就是 Dirichlet 卷积吗,于是就有 \(O(n)\) 的做法P5495 Dirichlet 前缀和 ,但我不会,所以我就用了 \(O(n\log n)\) 的暴力转移。

其实进一步观察就会发现其实 \(g_n=1^n\) ,所以好像是可以用 Min_25 筛的,但是我也不会。。。

所以最终复杂度是 \(O(n^{\frac{2}{3}}\log n)\) 的。

启发

  • 遇到问题先要想最普通的dp,然后再去考虑进一步转化的式子,不然很容易错过正解的方向。
  • 要注意 \(f_{n,m}=\sum_{i=2}^mf_{n-1,\lfloor\frac{m}{i}\rfloor}\) 这种dp形式。
posted @ 2022-08-11 21:58  qwq_123  阅读(36)  评论(0编辑  收藏  举报