原题链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1238
最近被51NOD的数论题各种刷……(NOI快到了我在干什么啊!
然后发现这题在网上找不到题解……那么既然A了就来骗一波访问量吧……
(然而并不会用什么公式编辑器,凑合着看吧……
Σ(1<=i<=n) Σ(1<=j<=n) i*j/gcd(i,j)
=Σ(1<=d<=n) d * Σ(1<=i<=[n/d]) Σ(1<=j<=[n/d]) i*j*[gcd(i,j)==1]
=Σ(1<=d<=n) d * Σ(1<=d‘<=[n/d]) f([n/d/d‘])*d‘^2*mui(d‘)
=Σ(1<=d‘<=n) d‘^2*mui(d‘) Σ(1<=d<=[n/d‘]) d*f([n/d/d‘])
这里f(x)=(x*(x+1)/2)^2,即1到x中数字之间两两乘积之和。
可以看出不同的[n/d‘]只有根号n个,对于某一个[n/d‘],不同的[n/d/d‘]也只有根号n个,那么把它们压在一起处理就好了。
但是要做到这一点需要快速求出d‘^2*mui(d‘)的前缀和,这时就要用上杜教筛了。
记g(x)=x^2*mui(x),S(x)=Σ(1<=i<=x) g(i)
那么Σ(1<=i<=n) Σ (x|i) g(x)*(n/x)^2=Σ(1<=i<=n) Σ(x|i) mui(x)=Σ(1<=i<=n) [i==1] = 1
同时Σ(1<=i<=n) Σ (x|i) g(x)*(n/x)^2=Σ(1<=i<=n) Σ(1<=x<=[n/i]) g(x)*i^2= Σ(1<=i<=n) i^2*S[n/i]
可以得到S(n)=1-Σ(2<=i<=n) i^2*S[n/i],预处理+哈希维护一波就行了
但是不知道是我常数太大,还是方法没别人优越,卡了很久常数才卡过去。
代码自己码啦!