HDU 3208 Integer’s Power

题目大意:

定义f(x)表示, x最多为某个正整数的f(x)次幂.求[l, r]区间内所有数f(x)的和. r不超过2 * 10 ^ 18.

 

简要分析:

我做复杂了, 于是这个做法就是:

注意到f(x)的值是小于64的, 我们就可以统计出[l, r]区间内的1次方数, 2次方数直至63次方数(并不是严格2次方, 可以包含4次方等). 令p[x]记录x次方数的个数, 现在我们考虑如何求恰为1次方数的数的个数. 很明显可以利用容斥原理, 答案就是p[1] - p[2] - p[3] - p[5] + p[6] - p[7] + p[10] - ..., 每一项的系数恰为该数的莫比乌斯函数(详见wiki). 对于其它的次数, 被它包含的只可能是它的倍数, 所以把这些数都除以你要统计的那个次数, 就回到刚才讨论的恰为1次的问题了. 时间复杂度O(64 ^ 2).

 

代码实现:

View Code

你可能感兴趣的:(Integer)