【hdu5382】GCD?LCM! 题解

题目大意

  令 f(n)=∑i=1n∑j=1n [ gcd(i,j)+lcm(i,j)≥n ]f(n)=\sum_{i=1}^n\sum_{j=1}^n~[~gcd(i,j)+lcm(i,j)≥n~],求 S(n)=∑i=1nf(i)S(n)=\sum_{i=1}^nf(i)。
  多组询问,T≤105,n≤106T \le 10^5,n \le 10^6。

第一反应

  拿到式子大多数同学开始反演了。。。
  TT 这么大,还得能预处理。。。

  直接刚反演的话,我反正是刚不出来,题解也不是这么做的。

题解

  考虑递推!!
  看 f(n−1)f(n-1) 如何推到 f(n)f(n)。我们发现,就是少了 i=ni=n 或 j=nj=n 的情况,然后多了 gcd+lcm=n−1gcd+lcm=n-1 的情况。当 i=ni=n 或 j=nj=n 时,lcm(i,j)≥nlcm(i,j)≥n,所以一定可以。因此递推式就是:

f(n)=f(n−1)+2n−1−∑i=1n−1∑j=1n−1 [ gcd⁡(i,j)+lcm(i,j)=n−1 ]f(n)=f(n-1)+2n-1-\sum_{i=1}^{n-1}\sum_{j=1}^{n-1}~[~\gcd(i,j)+lcm(i,j)=n-1~]

  后面那部分就可以反演了。

g(n)=∑i=1n∑j=1n [ gcd(i,j)+lcm(i,j)=n ]=∑d=1n∑i=1⌊nd⌋∑j=1⌊nd⌋ [ gcd(i,j)=1 ] [ d+ijd=n ]=∑d∣n∑i=1⌊nd⌋−1∑j=1⌊nd⌋−1 [ gcd(i,j)=1 ] [ ij=⌊nd⌋−1 ]=∑d∣nh(⌊nd⌋−1)h(m)=∑i=1m∑j=1m [ gcd(i,j)=1 ] [ ij=m ]=2λ(m)\begin{array}{rcl} g(n)&=&\sum_{i=1}^n\sum_{j=1}^n~[~gcd(i,j)+lcm(i,j)=n~]\\ &=&\sum_{d=1}^n\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor}~[~gcd(i,j)=1~]~[~d+ijd=n~]\\ &=&\sum_{d|n}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor-1}\sum_{j=1}^{\lfloor\frac{n}{d}\rfloor-1}~[~gcd(i,j)=1~]~[~ij=\lfloor\frac{n}{d}\rfloor-1~]\\ &=&\sum_{d|n}h(\lfloor\frac{n}{d}\rfloor-1)\\ h(m)&=&\sum_{i=1}^m\sum_{j=1}^m~[~gcd(i,j)=1~]~[~ij=m~]\\ &=&2^{\lambda(m)} \end{array}

  其中 λ(m)\lambda(m) 表示 mm 的质因数种类数,即 m=p1c1p2c2...pλ(m)cλ(m)m=p_1^{c_1}p_2^{c_2}...p_{\lambda(m)}^{c_{\lambda(m)}}

  到这一步,全部都可以预处理了。