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\) ,那么最终答案就是
并且 \(f_{n,m}\) 的 \(n\) 是 \(\log m\) 级别的,所以我们只需要快速计算 \(f_{n,m}\) 就可以了。
考虑 \(f_{n,m}\) 的转移,就是枚举下一个 \(d_i\) 是什么,有
熟知数论的同学就会发现,这就是杜教筛的形式,直接整除分块就有 \(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\) 。考虑这玩意的转移式:
诶,这不就是 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形式。