problem
给出一个数 n n n,计算:
∑ i = 1 n ∑ j = 1 n l c m ( i , j ) \sum_{i=1}^n\sum_{j=1}^n\mathrm{lcm}(i,j) i=1∑nj=1∑nlcm(i,j)
由于结果很大,输出答案模 1 0 9 + 7 10^9+7 109+7 的结果。
数据范围: n ≤ 1 0 10 n\le 10^{10} n≤1010。
solution
接下来的式子可能有点多,也有点复杂,建议在纸上好好推一下。
l c m \mathrm{lcm} lcm 并不好处理,我们先把它化成 gcd \gcd gcd:
∑ i = 1 n ∑ j = 1 n l c m ( i , j ) = ∑ i = 1 n ∑ j = 1 n i j gcd ( i , j ) = ∑ k = 1 n 1 k ∑ i = 1 n ∑ j = 1 n i j [ gcd ( i , j ) = k ] = ∑ k = 1 n k ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 ⌊ n k ⌋ i j [ gcd ( i , j ) = 1 ] \begin{aligned} \sum_{i=1}^n\sum_{j=1}^n\mathrm{lcm}(i,j)&=\sum_{i=1}^n\sum_{j=1}^n\frac{ij}{\gcd(i,j)}\\ &=\sum_{k=1}^n\frac 1 k\sum_{i=1}^{n}\sum_{j=1}^{n}ij[\;\gcd(i,j)=k\;]\\ &=\sum_{k=1}^nk\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^{\lfloor\frac{n}{k}\rfloor}ij[\;\gcd(i,j)=1\;] \end{aligned} i=1∑nj=1∑nlcm(i,j)=i=1∑nj=1∑ngcd(i,j)ij=k=1∑nk1i=1∑nj=1∑nij[gcd(i,j)=k]=k=1∑nki=1∑⌊kn⌋j=1∑⌊kn⌋ij[gcd(i,j)=1]
注意到枚举 i , j i,j i,j 的上界都是 ⌊ n k ⌋ \lfloor\frac{n}{k}\rfloor ⌊kn⌋,我们可以不用反演,有一种更简单的方法,即讨论一下 i < j i<j i<j, i = j i=j i=j, i > j i>j i>j 三种情况(其中 i > j i>j i>j 和 i < j i<j i<j 可以合并):
a n s = ∑ k = 1 n k ( 2 ∑ i = 1 ⌊ n k ⌋ ∑ j = 1 i i j [ gcd ( i , j ) = 1 ] − ∑ i = 1 ⌊ n k ⌋ i 2 [ gcd ( i , i ) = 1 ] ) = ∑ k = 1 n k ( 2 ∑ i = 1 ⌊ n k ⌋ i ( ∑ j = 1 i j [ gcd ( i , j ) = 1 ] ) − 1 ) \begin{aligned} ans&=\sum_{k=1}^nk(2\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}\sum_{j=1}^iij[\;\gcd(i,j)=1\;]-\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}i^2[\;\gcd(i,i)=1\;])\\ &=\sum_{k=1}^nk(2\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}i(\sum_{j=1}^ij[\;\gcd(i,j)=1\;])-1) \end{aligned} ans=k=1∑nk(2i=1∑⌊kn⌋j=1∑iij[gcd(i,j)=1]−i=1∑⌊kn⌋i2[gcd(i,i)=1])=k=1∑nk(2i=1∑⌊kn⌋i(j=1∑ij[gcd(i,j)=1])−1)
在进行下一步化简之前,我们先来证明一个式子: ∑ i = 1 n i [ gcd ( i , n ) = 1 ] = n φ ( n ) 2 \sum\limits_{i=1}^ni[\;\gcd(i,n)=1\;]=\frac{n\varphi(n)}{2} i=1∑ni[gcd(i,n)=1]=2nφ(n)。
根据辗转相减法,我们有 gcd ( i , n ) = gcd ( n − i , n ) \gcd(i,n)=\gcd(n-i,n) gcd(i,n)=gcd(n−i,n),这就意味着,当 gcd ( i , n ) = 1 \gcd(i,n)=1 gcd(i,n)=1 时,必然有 gcd ( n − i , n ) = 1 \gcd(n-i,n)=1 gcd(n−i,n)=1。因此,当答案要加上 i i i 的贡献时,必然也会有 n − i n-i n−i 的贡献,而 i + ( n − i ) = n i+(n-i)=n i+(n−i)=n。
又发现 ∑ i = 1 n [ gcd ( i , n ) = 1 ] = φ ( n ) \sum\limits_{i=1}^n[\;\gcd(i,n)=1\;]=\varphi(n) i=1∑n[gcd(i,n)=1]=φ(n),所以原式 = n φ ( n ) 2 =\frac{n\varphi(n)}{2} =2nφ(n)。
注意一下,当 n = 1 n=1 n=1 时,原式 = 1 =1 =1。
证毕。
所以上式可以继续化简(那个 [ i = 1 ] [\;i=1\;] [i=1] 就是特判 i = 1 i=1 i=1 的情况):
a n s = ∑ k = 1 n k ( 2 ∑ i = 1 ⌊ n k ⌋ i ( i φ ( i ) + [ i = 1 ] 2 ) − 1 ) = ∑ k = 1 n k ∑ i = 1 ⌊ n k ⌋ i 2 φ ( i ) \begin{aligned} ans&=\sum_{k=1}^nk(2\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}i(\frac{i\varphi(i)+[\;i=1\;]}{2})-1)\\ &=\sum_{k=1}^nk\sum_{i=1}^{\lfloor\frac{n}{k}\rfloor}i^2\varphi(i) \end{aligned} ans=k=1∑nk(2i=1∑⌊kn⌋i(2iφ(i)+[i=1])−1)=k=1∑nki=1∑⌊kn⌋i2φ(i)
于是我们令 f ( n ) = n 2 φ ( n ) f(n)=n^2\varphi(n) f(n)=n2φ(n)(容易发现它是个积性函数),设 F ( n ) F(n) F(n) 为它的前缀和。
那么答案就是:
a n s = ∑ k = 1 n k × F ( ⌊ n k ⌋ ) ans=\sum_{k=1}^nk\times F(\lfloor\frac{n}{k}\rfloor) ans=k=1∑nk×F(⌊kn⌋)
这个显然可以整除分块,接下来就是考虑如何计算 F ( n ) F(n) F(n)。
考虑给 f f f 卷上个 I d 2 Id^2 Id2( I d 2 ( n ) = n 2 Id^2(n)=n^2 Id2(n)=n2),得到:
( f ∗ I d 2 ) ( n ) = ∑ d ∣ n f ( d ) I d 2 ( n d ) = ∑ d ∣ n d 2 φ ( d ) n 2 d 2 = n 2 ∑ d ∣ n φ ( d ) = n 3 \begin{aligned} (f*Id^2)(n)&=\sum_{d|n}f(d)Id^2(\frac{n}{d})\\ &=\sum_{d|n}d^2\varphi(d)\frac{n^2}{d^2}\\ &=n^2\sum_{d|n}\varphi(d)\\ &=n^3 \end{aligned} (f∗Id2)(n)=d∣n∑f(d)Id2(dn)=d∣n∑d2φ(d)d2n2=n2d∣n∑φ(d)=n3
那么肯定也有 ∑ d ∣ n I d 2 ( d ) f ( n d ) = n 3 \sum_{d|n}Id^2(d)f(\frac{n}{d})=n^3 ∑d∣nId2(d)f(dn)=n3,所以:
∑ i = 1 i 3 = ∑ i = 1 i ∑ d ∣ i I d 2 ( d ) f ( i d ) = ∑ d = 1 n d 2 ∑ i = 1 ⌊ n d ⌋ f ( i ) = ∑ d = 1 n d 2 × F ( ⌊ n d ⌋ ) \begin{aligned} \sum_{i=1}i^3&=\sum_{i=1}^i\sum_{d|i}Id^2(d)f(\frac{i}{d})\\ &=\sum_{d=1}^nd^2\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f(i)\\ &=\sum_{d=1}^nd^2\times F(\lfloor\frac{n}{d}\rfloor) \end{aligned} i=1∑i3=i=1∑id∣i∑Id2(d)f(di)=d=1∑nd2i=1∑⌊dn⌋f(i)=d=1∑nd2×F(⌊dn⌋)
又因为 ∑ i = 1 n i 3 = n 2 ( n + 1 ) 2 4 \sum\limits_{i=1}^ni^3=\frac{n^2(n+1)^2}{4} i=1∑ni3=4n2(n+1)2,所以:
F ( n ) = n 2 ( n + 1 ) 2 4 − ∑ d = 2 n d 2 × F ( ⌊ n d ⌋ ) F(n)=\frac{n^2(n+1)^2}{4}-\sum_{d=2}^nd^2\times F(\lfloor\frac{n}{d}\rfloor) F(n)=4n2(n+1)2−d=2∑nd2×F(⌊dn⌋)
然后又一个整除分块就可以了。
时间复杂度 O ( n 2 3 ) O(n^{\frac{2}{3}}) O(n32)。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<unordered_map>
#define N 5000005
#define P 1000000007
#define ll long long
using namespace std;
ll n,inv2,inv4,inv6,f[N];
int sum,prime[N],mark[N],phi[N];
ll power(ll a,ll b,ll ans=1){
for(;b;b>>=1,a=a*a%P)
if(b&1) ans=ans*a%P;
return ans;
}
void linear_sieves(){
f[1]=1;
for(int i=2;i<N;++i){
if(!mark[i]) prime[++sum]=i,phi[i]=i-1;
for(int j=1;j<=sum&&i*prime[j]<N;++j){
mark[i*prime[j]]=1;
if(i%prime[j]==0) {phi[i*prime[j]]=phi[i]*prime[j];break;}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
f[i]=(ll)i*i%P*phi[i]%P,f[i]=(f[i]+f[i-1])%P;
}
inv2=power(2,P-2),inv4=power(4,P-2),inv6=power(6,P-2);
}
ll Squ(ll x) {return x%P*x%P;}
ll sum2(ll n) {return n%P*((n+1)%P)%P*((2*n%P+1)%P)%P*inv6%P;}
ll sum3(ll n) {return Squ(n%P)*Squ((n+1)%P)%P*inv4%P;}
unordered_map<ll,ll>Sum;
ll F(ll n){
if(n<N) return f[n];
if(Sum[n]) return Sum[n];
ll ans=sum3(n);
for(ll i=2,j;i<=n;i=j+1){
j=n/(n/i);
ans=(ans-((sum2(j)-sum2(i-1)+P)%P*F(n/i)%P)+P)%P;
}
return Sum[n]=ans;
}
int main(){
linear_sieves();
scanf("%lld",&n);
int ans=0;
for(ll i=1,j;i<=n;i=j+1){
j=n/(n/i);
ans=(ans+((i+j)%P*((j-i+1)%P)%P*inv2%P)*F(n/i)%P)%P;
}
printf("%d",ans);
return 0;
}