51Nod 最大公约数之和V1,V2,V3;最小公倍数之和V1,V2,V3

Posted autoint

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51Nod 最大公约数之和V1,V2,V3;最小公倍数之和V1,V2,V3相关的知识,希望对你有一定的参考价值。

1040 最大公约数之和

给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6
1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15

输入

1个数N(N <= 10^9)

输出

公约数之和

输入样例

6

输出样例

15

题解

\\[ \\sum_i=1^n\\gcd(i,n)=\\sum_d|nd\\varphi(n) \\]
暴力搞就行了。

1188 最大公约数之和 V2

给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和。
相当于计算这段程序(程序中的gcd(i,j)表示i与j的最大公约数):

G=0
for i=1 to N
    for j=i+1 to N
        G+=gcd(i,j)

输入
第1行:1个数T,表示后面用作输入测试的数的数量。(1 <= T <= 50000)
第2 - T + 1行:每行一个数N。(2 <= N <= 5000000)
输出
共T行,输出最大公约数之和。
输入样例
3
10
100
200000
输出样例
67
13015
143295493160

1237 最大公约数之和 V3

给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和。
相当于计算这段程序(程序中的gcd(i,j)表示i与j的最大公约数):
由于结果很大,输出Mod 1000000007的结果。

G=0
for i=1 to N
    for j=1 to N
        G = (G + gcd(i,j)) mod 1000000007;

输入

输入一个数N。(2 <= N <= 10^10)

输出

输出G Mod 1000000007的结果。

输入样例

100

输出样例

31080

可以看出来,T2,T3转化一下就只有数据范围不同。

题解

\\[ \\sum_i=1^n\\sum_j=1^n\\gcd(i,j)\\=\\sum_d=1^nd\\sum_i=1^\\lfloor\\frac nd\\rfloor\\sum_j=1^\\lfloor\\frac nd\\rfloor[\\gcd(i,j)=1]\\=\\sum_d=1^nd\\sum_i=1^\\lfloor\\frac nd\\rfloor\\sum_j=1^\\lfloor\\frac nd\\rfloor\\sum_d'|\\gcd(i,j)\\mu(d)\\=\\sum_d=1^nd\\sum_d'=1^\\lfloor\\frac nd\\rfloor\\mu(d')\\lfloor\\frac ndd'\\rfloor^2 \\]
整除分块两次,区别在于第二次。

  • V2可以直接线性筛求出\\(\\mu\\)前缀和。
  • V3必须使用杜教筛,让\\(\\mu * I\\)即可。

1363 最小公倍数之和

1.5 秒 131,072.0 KB 160 分 6 级题
给出一个n,求1-n这n个数,同n的最小公倍数的和。
例如:n = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66。
由于结果很大,输出Mod 1000000007的结果。

输入

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 50000)
第2 - T + 1行:T个数Ai

输出

共T行,输出对应的最小公倍数之和

输入样例

3
5
6
9

输出样例

55
66
279



这题跟SPOJ LCMsum是一样的,只不过数据范围不一样,所以推到后面的操作不一样。

Star_Feel的题解

原题相当于求\\(\\sum_i=1^n\\fraci*ngcd(i,n)\\)

先枚举\\(d=\\gcd(i,n)\\),然后化简得到
\\[ n*\\sum_d|n\\sum_i=1^\\fracndi[\\gcd(i,\\fracnd)=1] \\]
相当于求\\(1\\)\\(n-1\\)中,与\\(n\\)互质的数和,设\\(y<x\\),如果\\(\\gcd(y,x)=1\\),那么\\(\\gcd(x-y,x)=1\\),两式的贡献就是\\(x\\)

所以\\(1\\)\\(n-1\\)中,与\\(n\\)互质的数和为\\(\\frac\\phi(n)*n2\\),特殊的,如果\\(n=1,2\\),则和为\\(1\\)

那么原式就等于
\\[ n*\\sum_d|n且d不为n\\frac\\fracnd*\\phi(\\fracnd)2+1 \\]
再化简得到
\\[ n+\\fracn2\\sum_d|n且d>1d*phi(d) \\]
这样,这个式子就变成\\(O(\\sqrtn)\\),但是多组数据仍会超时

实际上我们将\\(n\\)质因数分解得到\\(n=\\prod_i=1^xp[i]^a[i]\\)

因为\\(p[i]\\)两两互质,所以可以转化为
\\[ n+\\prod_i=1^x\\sum_j=0^a[i]\\phi(p[i]^j)*p[i]^j \\]
根据欧拉函数的性质可以得到
\\[ n+\\prod_i=1^x1+\\sum_j=1^a[i](p[i]-1)*p[i]^2j-1 \\]
再根据等比数列求和公式得到
\\[ n+\\prod_i=1^x1+(p[i]-1)*\\fracp[i]^2*a[i]+1-p[i]p[i]^2-1\\=n+\\prod_i=1^x1+\\fracp[i]^2*a[i]+1-p[i]p[i]+1 \\]
然后线筛素数加速质因数分解就可以过了,记得最后处理\\(1,2\\)的情况

1190 最小公倍数之和 V2

给出2个数a, b,求LCM(a,b) + LCM(a+1,b) + .. + LCM(b,b)。
例如:a = 1, b = 6,1,2,3,4,5,6 同6的最小公倍数分别为6,6,6,12,30,6,加在一起 = 66。
由于结果可能很大,输出Mod 10^9 + 7的结果。(测试数据为随机数据,没有构造特别坑人的Test)

输入

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 50000)
第2 - T + 1行:每行2个数a, b,中间用空格分隔(1 <= a <= b <= 10^9)

输出

共T行,输出对应的最小公倍数之和Mod 10^9 + 7的结果。

输入样例

3
1 6
10 15
41 90

输出样例

66
675
139860

Cold_Chair的题解

\\[ ans = \\sum_i = a^b \\textrmlcm(i) \\= b*\\sum_d | b \\sum_i = \\lfloor a \\over d\\rfloor^\\lceil b \\over d\\rceil i * [\\gcd(i, b \\over d) = 1] \\= b*\\sum_d | b \\sum_i = \\lfloor a \\over d\\rfloor^\\lceil b \\over d\\rceil i * \\sum_d' | \\gcd(i, b \\over d) μ(d') \\= b*\\sum_d | b \\sum_d' | b \\over d μ(d') * d' * \\sum_i = \\lfloor b \\over d \\rfloor^\\lceil a \\over d\\rceili*[d' | i] \\= b*\\sum_d | b \\sum_d' | b \\over d μ(d') * d' * \\sum_i = \\lfloor b \\over d*d' \\rfloor^\\lceil a \\over d * d'\\rceili \\= b*\\sum_d | b \\sum_d' | b \\over d μ(d') * d' * (\\lfloor b \\over d*d' \\rfloor - \\lceil a \\over d * d'\\rceil + 1) * (\\lfloor b \\over d*d' \\rfloor + \\lceil a \\over d * d'\\rceil) / 2 \\]

设$T = d * d’ $
\\[ = b*\\sum_T | b(\\lfloor b \\over T\\rfloor - \\lceil a \\over T\\rceil + 1) * (\\lfloor b \\over T\\rfloor + \\lceil a \\over T\\rceil) / 2 * \\sum_d | T μ(d) * d \\]
我们观察一下$\\sum_d | T μ(d) * d $
狄利克雷卷积做了这么多,轻松可得:
\\(T = \\prodp_i^q_i\\),那么
\\[ \\sum_d | T μ(d) * d = \\prod1-p_i \\]

1238 最小公倍数之和 V3

出一个数N,输出小于等于N的所有数,两两之间的最小公倍数之和。

相当于计算这段程序(程序中的lcm(i,j)表示i与j的最小公倍数):

由于结果很大,输出Mod 1000000007的结果。

G=0
for i=1 to N
    for j=1 to N
        G = (G + lcm(i,j)) mod 1000000007;

输入

输入一个数N。(2 <= N <= 10^10)

输出

输出G Mod 1000000007的结果。

输入样例

4

输出样例

72

题解

\\[ \\sum_i=1^n\\sum_j=1^n\\textrmlcm(i,j)=\\sum_i=1^n\\sum_j=1^n\\fracij\\gcd(i,j)\\=\\sum_d=1^nd\\sum_i=1^\\lfloor\\frac nd\\rfloor\\sum_j=1^\\lfloor\\frac nd\\rfloorij[\\gcd(i,j)=1]\\=\\sum_d=1^nd\\sum_i=1^\\lfloor\\frac nd\\rfloor\\sum_j=1^\\lfloor\\frac nd\\rfloorij\\sum_d'|\\gcd(i,j)\\mu(d)\\=\\sum_d=1^nd\\sum_d'=1^\\lfloor\\frac nd\\rfloor\\mu(d')(d')^2\\left(\\sum_i=1^\\lfloor\\frac ndd'\\rfloori\\right)^2 \\]
然后就变成了LG3768 简单的数学题,外面多套了一个整除分块,不过不影响复杂度。(毒瘤)

以上是关于51Nod 最大公约数之和V1,V2,V3;最小公倍数之和V1,V2,V3的主要内容,如果未能解决你的问题,请参考以下文章

51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))

51nod1110 距离之和最小 V3

51nod 1110 距离之和最小V3

《51nod1237 最大公约数之和 V3》

51Nod 1237 最大公约数之和 V3 杜教筛

51nod1238 最小公倍数之和 V3