zoukankan      html  css  js  c++  java
  • 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}^ngcd(i,n)=sum_{d|n}dvarphi(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}^nsum_{j=1}^ngcd(i,j)\ =sum_{d=1}^ndsum_{i=1}^{lfloorfrac nd floor}sum_{j=1}^{lfloorfrac nd floor}[gcd(i,j)=1]\ =sum_{d=1}^ndsum_{i=1}^{lfloorfrac nd floor}sum_{j=1}^{lfloorfrac nd floor}sum_{d'|gcd(i,j)}mu(d)\ =sum_{d=1}^ndsum_{d'=1}^{lfloorfrac nd floor}mu(d')lfloorfrac n{dd'} floor^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个数A[i](A[i] <= 10^9)

    输出

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

    输入样例

    3
    5
    6
    9

    输出样例

    55
    66
    279


    这题跟[SPOJ LCMsum](https://www.cnblogs.com/autoint/p/9892650.html)是一样的,只不过数据范围不一样,所以推到后面的操作不一样。 ## [Star_Feel](https://www.cnblogs.com/Never-mind/p/9882196.html)的题解 原题相当于求$sum_{i=1}^{n}frac{i*n}{gcd(i,n)}$

    先枚举(d=gcd(i,n)),然后化简得到

    [n*sum_{d|n}sum_{i=1}^{frac{n}{d}}i[gcd(i,frac{n}{d})=1] ]

    相当于求(1)(n-1)中,与(n)互质的数和,设(y<x),如果(gcd(y,x)=1),那么(gcd(x-y,x)=1),两式的贡献就是(x)

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

    那么原式就等于

    [n*sum_{d|n且d不为n}frac{frac{n}{d}*phi(frac{n}{d})}{2}+1 ]

    再化简得到

    [n+frac{n}{2}sum_{d|n且d>1}d*phi(d) ]

    这样,这个式子就变成(O(sqrt{n})),但是多组数据仍会超时

    实际上我们将(n)质因数分解得到(n=prod_{i=1}^{x}p[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}^{x}1+sum_{j=1}^{a[i]}(p[i]-1)*p[i]^{2j-1} ]

    再根据等比数列求和公式得到

    [n+prod_{i=1}^{x}1+(p[i]-1)*frac{p[i]^{2*a[i]+1}-p[i]}{p[i]^2-1}\ =n+prod_{i=1}^{x}1+frac{p[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 extrm{lcm}(i) \ = b*sum_{d | b} sum_{i = lfloor{ {a} over {d}} floor}^{lceil{ {b} over {d}} ceil} i * [gcd(i, { {b} over {d}}) = 1] \ = b*sum_{d | b} sum_{i = lfloor{ {a} over {d}} floor}^{lceil{ {b} over {d}} ceil} 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 }} floor}^{lceil{ {a} over {d}} ceil}i*[d' | i] \ = b*sum_{d | b} sum_{d' | { {b} over {d}}} μ(d') * d' * sum_{i = lfloor{ {b} over {d*d' }} floor}^{lceil{ {a} over {d * d'}} ceil}i \ = b*sum_{d | b} sum_{d' | { {b} over {d}}} μ(d') * d' * (lfloor{ {b} over {d*d' }} floor - lceil{ {a} over {d * d'}} ceil + 1) * (lfloor{ {b} over {d*d' }} floor + lceil{ {a} over {d * d'}} ceil) / 2 ]

    设$T = d * d’ $

    [= b*sum_{T | b}(lfloor{ {b} over {T}} floor - lceil{ {a} over {T}} ceil + 1) * (lfloor{ {b} over {T}} floor + lceil{ {a} over {T}} ceil) / 2 * sum_{d | T} μ(d) * d ]

    我们观察一下$sum_{d | T} μ(d) * d ( 狄利克雷卷积做了这么多,轻松可得: 若)T = prod{p_i^{q_i}}$,那么

    [sum_{d | T} μ(d) * d = prod{1-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}^nsum_{j=1}^n extrm{lcm}(i,j)=sum_{i=1}^nsum_{j=1}^nfrac{ij}{gcd(i,j)}\ =sum_{d=1}^ndsum_{i=1}^{lfloorfrac nd floor}sum_{j=1}^{lfloorfrac nd floor}ij[gcd(i,j)=1]\ =sum_{d=1}^ndsum_{i=1}^{lfloorfrac nd floor}sum_{j=1}^{lfloorfrac nd floor}ijsum_{d'|gcd(i,j)}mu(d)\ =sum_{d=1}^ndsum_{d'=1}^{lfloorfrac nd floor}mu(d')(d')^2left(sum_{i=1}^{lfloorfrac n{dd'} floor}i ight)^2 ]

    然后就变成了LG3768 简单的数学题,外面多套了一个整除分块,不过不影响复杂度。(毒瘤)

  • 相关阅读:
    小学生二元四则运算(F)
    补进度条
    附加作业
    个人总结
    第四 五周结对作业(照片)
    第四,五周——Java编写的电梯模拟系统(结对作业)
    第三周(JAVA编写的 wordcount)
    第三周续(读代码)
    第三周
    第二周续.(代码)
  • 原文地址:https://www.cnblogs.com/autoint/p/gcd_and_lcm.html
Copyright © 2011-2022 走看看