Description
题目链接:Codeforces 1097D
Makoto 有一个大黑板,上面写着一个正整数 $n$,他将会进行恰好 $k$ 次操作:
假设黑板上的数字是 $v$,他会随机选择一个 $v$ 的约数(可能是 $1$ 或 $v$)然后用这个约数替换 $v$。保证每个约数被选择的概率相同。
他想知道 $k$ 次操作后黑板上的数字的期望值是多少。答案对 $10^9+7$ 取模。
数据范围:$1\le n\le 10^{15}$,$1\le k\le 10^4$
Solution
我们定义 $f(i,j)$ 表示操作 $i$ 次后得到数字 $j$ 的概率。发现每个质因子都是相互独立的,每次改变的只不过是若干个质因子的指数。那么这意味着 $f$ 是一个积性函数!
考虑对于 $n$ 的一个质因子 $p$,其指数为 $c$,那么设 $g(i,j)$ 表示数字 $p^c$ 操作 $i$ 次后指数为 $j$ 的概率。转移方程为:
这个式子的含义是:指数 $j$ 可以由指数 $j\sim c$ 转移过来,对于原来的指数 $k$,有 $\frac{1}{k+1}$ 的概率转移到现在的指数 $j$(其实这个式子可以前缀和优化,复杂度由 $O(kc^2)$ 优化为 $O(kc)$,但是由于 $c\le \log n$,因此无关紧要)。
那么数字 $p^c$ 操作后的期望为:
最终的答案为所有质因子答案的乘积(积性函数的定义)。
时间复杂度:$O(k\log^3 n)$(非常不满),优化后为 $O(k\log^2 n)$
Code
朴素写法
1 |
|
前缀和优化
1 |
|