题解:洛谷P1891 疯狂LCM
题目描述
描述:
众所周知,czmppppp是数学大神犇。一天,他给众蒟蒻们出了一道数论题,蒟蒻们都惊呆了。。。
给定正整数N,求LCM(1,N)+LCM(2,N)+...+LCM(N,N)。
输入输出格式
输入格式:第一行一个数T,表示有T组数据。
对于每组数据,一行,一个正整数N。
输出格式:T行,每行为对应答案。
输入输出样例
说明
对于30%的数据,1≤T≤5,1≤N≤100000
对于100%的数据,1≤T≤300000,1≤N≤1000000
题解
挺妙的一道题。
要求的是\(\sum_{i=1}^{n}lcm(i, n)\),一看好像没什么思路(可能是本人菜)。当然只会想到暴力打表和看题解了……😄
首先这步应该地球人都会去试:
\[\sum_{i=1}^{n}lcm(i, n) = n \sum_{i=1}^{n}\frac{i}{\gcd(i, n)}
\]
然后很关键的一步是像证明莫反一样添一个\(\sum\)(说一句废话),式子就变成了:
\[n\sum_{d\mid n}\sum_{i=1}^{n}\frac{i}{d}[d=\gcd(i, n)]
\]
中括号里是一个类似布尔型的变量。
对于中括号里的式子,两边同除以\(d\):
\[n\sum_{d\mid n}\sum_{i=1}^{n}\frac{i}{d}[\gcd(\frac{i}{d}, \frac{n}{d}) = 1]
\]
把\(\frac{i}{d}\)变成\(i\),得到:
\[n\sum_{d\mid n}\sum_{i=1}^{\frac{n}{d}}i[\gcd(i, \frac{n}{d}) = 1]
\]
把\(d\)倒着枚举,我们就得到了酱紫的东西:
\[n\sum_{d\mid n}\sum_{i=1}^{d}i[\gcd(i,d) = 1]
\]
然后我们来看\(\sum_{i=1}^{d}i[\gcd(i,d) = 1]\):与\(d\)互质的所有数之和。
如果是个数就好求了……
等等,个数?我们是否可以从个数出发?
想一想,对于\(\gcd(i, d) = 1\),\(\gcd(d-i, d)\)是什么?显然也是\(1\)。
所以\(i\)是成对出现的(\(d=1\)除外)。
于是我们发现(当\(d \not= 1\)时):
\[\sum_{i=1}^{d}i[\gcd(i,d) = 1] = \frac{\varphi(d)}{2} d
\]
\(O(n)\)预处理\(\varphi\),对于每次询问\(O(\sqrt{n})\)枚举\(d\)回答。
这种算法有点卡,注意能不开long long
的地方就别开long long
。