题意 Lcm(a,b)表示a和b的最小公倍数,A(n)表示Lcm(n,i)的平均数(1 <= i <= n),
例如:A(4) = (Lcm(1,4) + Lcm(2,4) + Lcm(3,4) + Lcm(4,4)) / 4 = (4 + 4 + 12 + 4) / 4 = 6。
F(a, b) = A(a) + A(a + 1) + …… A(b)。(F(a,b) = ∑A(k), a <= k <= b)
例如:F(2, 4) = A(2) + A(3) + A(4) = 2 + 4 + 6 = 12。
给出a,b,计算F(a, b),由于结果可能很大,输出F(a, b) % 1000000007的结果即可。
1 <= a <= b <= 10^9
分析 我们要求的实际就是
∑i=1n∑j=1ijgcd(i,j)
=∑d=1n∑i=1?nd?∑j=1ij?[gcd(i,j)=1]
到这里为止就有两种方法,一种是转化为用 φ(d)来做,这样会好做很多,但我没想到,于是用了反演的做法。
按套路反演一波很容易得到 ans=12?∑k=1nμ(k)?k?∑d=1?nk?∑i=1?nkd?(i2+i)
设 s(d)=μ(d)?d,f(d)=d?(d+1)?(2d+1)6+n?(n+1)2
那么 ans=12?∑k=1ns(k)?∑d=1?nk?f(?nkd?)
设 T=kd可以得到 ans=12?∑T=1nf(?nT?)?∑d|Ts(d)
现在问题就在于如何求 g(T)=∑d|Tμ(d)?d的前缀和。
画一画不难发现 ∑d=1ng(d)=∑d=1nS(?nd?)
其中 S(d)=∑ni=1s(i)。
注意到 s(d)和 g(d)都是积性函数,可以用线性筛预处理一部分,然后其余的用杜教筛即可。 【莫比乌斯反演|51nod 1227 平均最小公倍数 莫比乌斯反演+杜教筛】
代码
#include
#include
#include
#include
#include
#include
推荐阅读
- 数论|Codeforces 235E Number Challenge 莫比乌斯反演+数论
- 杜教筛|hdu 6706 huntian oy 杜教筛
- 数论|HDU 6706 huntian oy(杜教筛)
- 刷题小结|51nod 1227 平均最小公倍数
- 筛法|[JZOJ5134][SDOI省队集训2017]三元组
- Code|CodeForces 839 D.Winter is here(莫比乌斯反演+组合数学)
- 莫比乌斯反演|Codeforces 235 E Number Challenge(莫比乌斯反演)
- 杜教筛|[学习笔记] 杜教筛 (51nod 1244+1227 +1237 +1238+1239) - 数论
- [51Nod 1238] 最小公倍数之和 (恶心杜教筛)
- 莫比乌斯反演|【51NOD 1227】平均最小公倍数