zoukankan      html  css  js  c++  java
  • *P2398 GCD SUM[数论]

    题目描述

    for i=1 to n

    for j=1 to n

     sum+=gcd(i,j)
    

    解析

    给出n求sum. gcd(x,y)表示x,y的最大公约数.

    直接枚举复杂度为(O(n^2)),显然无法承受。

    我们需要寻找更优的算法。

    首先,打表找规律,当(n=10)时,是这样的

    1 1 1 1 1 1 1 1 1 1
    1 2 1 2 1 2 1 2 1 2
    1 1 3 1 1 3 1 1 3 1
    1 2 1 4 1 2 1 4 1 2
    1 1 1 1 5 1 1 1 1 5
    1 2 3 2 1 6 1 2 3 2
    1 1 1 1 1 1 7 1 1 1
    1 2 1 4 1 2 1 8 1 2
    1 1 3 1 1 3 1 1 9 1
    1 2 1 2 5 2 1 2 1 10
    

    可以看到,上半部分和下半部分是对称的,我们考虑一边即可。


    (gcd(i,j)=x),那么(gcd(ki,kj)=kx)

    因此,显然对于任意(gcd(i,j)=1),有(gcd(ki,kj)=k),且充要。我们枚举(k),对于每个(k),计算(gcd(ki,kj)=k)的数量即可。

    由于(gcd(ki,kj),gcd(kj,ki))被算作分开的两次,而(gcd(i,i))只会被算一次,所以减去1。

    因此,对于所有的(i),计算

    [sum_{i=1}^n(sum_{k=1}^{lfloor frac{n}{i} floor}2*varphi(k)-1)*i ]

    预处理(varphi(k))的前缀和即可(O(n))求解。


    推导过程

    [egin{align} Ans &=sum_{i=1}^nsum_{j=1}^ngcd(i,j)\ &=sum_{i=1}^nsum_{j=1}^nsum_{k=1}^{n}[gcd(i,j)==k]\ &=sum_{i=1}^nsum_{j=1}^nsum_{kmid i , j}[gcd(i/k,j/k)==1]\ &=sum_{i=1}^{lfloorfrac{n}{k} floor}(2sum_{j=1}^{i}sum_{k=1}^n[gcd(i,j)==1]-1)\ &=sum_{i=1}^n(sum_{k=1}^{lfloor frac{n}{i} floor}2*varphi(k)-1)*i end{align} ]

  • 相关阅读:
    汇编-实验9
    Starling开源手势库AcheGesture
    Robotlegs2的Starling扩展
    Flash Builder 4.6/4.7 注释以及字体大小修改
    js中函数的理解
    js对象引用赋值后
    var声明提前 undefined
    光棍节程序员闯关秀
    body和普通div背景图宽高百分比的区别
    笔试题
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/11747900.html
Copyright © 2011-2022 走看看