1. 程式人生 > >51nod1238 最小公倍數之和V3【杜教篩】

51nod1238 最小公倍數之和V3【杜教篩】

題意:

i = 1 n

j = 1 n l c m (
i , j )          m o d
  1 0 9 ​ + ​ 7 n < = 1 0 10 \sum_{i=1}^n\sum_{j=1}^nlcm(i,j) ~~~~~~~~mod~10^9\!+\!7\\n<=10^{10}

題目分析:

化簡, i = 1 n j = 1 n l c m ( i , j ) = i = 1 n j = 1 n i j g c d ( i , j ) \sum_{i=1}^n\sum_{j=1}^nlcm(i,j)\\=\sum_{i=1}^n\sum_{j=1}^n\frac {i*j}{gcd(i,j)}
列舉gcd = d = 1 n d i = 1 n d j = 1 n d [ g c d ( i , j ) = = 1 ] i j =\sum_{d=1}^nd*\sum_{i=1}^{\frac nd}\sum_{j=1}^{\frac nd}[gcd(i,j)==1]*i*j
OK,且慢,這裡的gcd(i,j)==1就很講究了,有兩種方法

法一:尤拉函式 φ \varphi

因為 i = 1 n d j = 1 n d \sum_{i=1}^{\frac nd}\sum_{j=1}^{\frac nd} 是對稱的,所以可以化為
= d = 1 n d { ( 2 i = 1 n d i j = 1 i j [ ( i , j ) = = 1 ] ) 1 } = d = 1 n d { ( 2 i = 1 n d i i φ ( i ) + [ i = 1 ] 2 ) 1 } = d = 1 n d i = 1 n d i 2 φ ( i ) =\sum_{d=1}^nd*\left\{\left(2\sum_{i=1}^{\frac nd}i\sum_{j=1}^ij[(i,j)==1]\right)-1\right\}\\=\sum_{d=1}^nd*\left\{\left(2\sum_{i=1}^{\frac nd}i*\frac{i*\varphi(i)+[i=1]}2\right)-1\right\}\\=\sum_{d=1}^nd*\sum_{i=1}^{\frac nd}i^2*\varphi(i)
然後按照d分塊優化,要求 i 2 φ ( i ) i^2*\varphi(i) 的字首和,把它看做 i d i d φ id\cdot id\cdot\varphi
那麼 ( i d i d φ ) ( i d i d ) = (id\cdot id\cdot\varphi)*(id\cdot id)=