【HDU6037】Expectation Division(动态规划,搜索)
题面
Vjudge
你有一个数\(n\),\(n\le 10^{24}\),为了方便会告诉你\(n\)分解之后有\(m\)个不同的质因子,并且把这些质因子给你。
你每次可以把\(n\)变成一个它的约数,求变成\(1\)的期望步数。
题解
首先暴力的转移是:
\[f[n]=1+\frac{1}{\sigma(n)}\sum_{d|n}f[d]\]
不难发现这个状态之和每个质因子的出现次数的集合相关,与质因子是什么无关。
发现\(n\)本质不同的质因子最多只有\(18\)个,那么我们爆搜这个每个质因子出现次数的集合,强制较小的质因子出现次数较大,搜完之后发现状态只有\(172513\)个。
于是我们对于每个\(n\)的质因子出现个数的集合计算答案,只需要求解一个高维前缀和就可以进行转移了。
这里高维前缀和的求法,设\(g[n][j]\)表示对于\(n\)这个数(这个数是爆搜出来的,也就是满足小的质因子的出现次数不会少于大的质因子的出现次数),其前\(j\)个质因子的出现次数都相同,但是\(j\)之后的质因子出现次数小于等于当前位置的所有\(f[n]\)的和,转移的时候枚举给哪一位减一就行了。
#include
#include
#include
#include
#include