本文主要是介绍DTOJ 2937. Sum of LCM,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:
对于 A 1 , A 2 , … , A N A_1, A_2, \ldots, A_N A1,A2,…,AN ,求 ∑ i = 1 N ∑ j = 1 N l c m ( A i , A j ) \sum_{i = 1}^N \sum_{j = 1}^N \mathrm{lcm}(A_i, A_j) ∑i=1N∑j=1Nlcm(Ai,Aj) 的值。
l c m ( a , b ) \mathrm{lcm}(a, b) lcm(a,b) 表示 a a a 和 b b b 的最小公倍数
题解:
如果先考虑数 A i A_{i} Ai,再算 l c m lcm lcm的贡献,则难以避免 O ( N 2 ) O(N^{2}) O(N2)的枚举,故换一个角度,考虑枚举 g c d gcd gcd,计算以这个数为 g c d gcd gcd的每对数的贡献。而对于是两个数的 g c d gcd gcd这样的条件也不好判断,故先退一步,将条件改为是两个数的公约数,于是,对于枚举的每一个 d d d,记 s [ d ] s[d] s[d]为 ∑ i = 1 N A i / d ∗ [ d ∣ A i ] \sum_{i=1}^NA_{i}/d*[d|A_i] ∑i=1NAi/d∗[d∣Ai],则 d d d作为公约数的贡献为 s [ d ] 2 ∗ d s[d]^{2}*d s[d]2∗d,然后考虑计算作为真正 g c d gcd gcd时的贡献,即减去所有它的倍数的答案*倍数大小。
这篇关于DTOJ 2937. Sum of LCM的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!