C. Strange Function
题目描述:
定义f(i)为最小的不能被 i 整除的正整数
求
∑
i
=
1
n
f
(
i
)
sum_{i=1}^{n}f(i)
∑i=1nf(i),1<=n<=1e16
思路:
打表发现根本找不到规律
暴力算肯定不行,毕竟n巨大
这个时候就该想想在n这么大的情况下不能暴力,也没有规律该怎么办
对于f(i) = x,我们分析一下会发现,因为 x 是最小的不能被 i 整除的最小正数,就说明其实 i 能整除 1 到 i - 1中的任何一个,也就是能整除lcm(1, 2, ……, x-1),但是绝对不能整除 x ,也就是说不能整除lcm(1, 2, ……, x),可以发现其实 x 的值不会很大,不到100,那我们就需要一个可以快速的统计出 n 个数中对于每个 x 满足 f(i) = x 的 i 的数量的方法就可以解决问题,根据上面写的两个lcm可以做一个容斥,f(i) = x的个数其实就等于
n
u
m
=
n
/
(
l
c
m
(
1
,
2
,
3
…
…
x
−
1
)
)
−
n
/
(
l
c
m
(
1
,
2
,
3
…
…
,
x
)
)
num = n / (lcm(1,2,3……x-1)) - n/(lcm(1,2,3……,x))
num=n/(lcm(1,2,3……x−1))−n/(lcm(1,2,3……,x)),而这个x产生的贡献就是x * num,而当lcm大于n的时候就不会再产生ans的贡献了就可以直接输出
总结:
当数据范围巨大的时候,考虑能否进行数论分块,分别计算每个块的答案
#include