【51nod 1238】最小公倍数之和 V3

传送门


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=1nj=1nlcm(i,j)

由于结果很大,输出答案模 1 0 9 + 7 10^9+7 109+7 的结果。

数据范围: n ≤ 1 0 10 n\le 10^{10} n1010


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=1nj=1nlcm(i,j)=i=1nj=1ngcd(i,j)ij=k=1nk1i=1nj=1nij[gcd(i,j)=k]=k=1nki=1knj=1knij[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=1nk(2i=1knj=1iij[gcd(i,j)=1]i=1kni2[gcd(i,i)=1])=k=1nk(2i=1kni(j=1ij[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=1ni[gcd(i,n)=1]=2nφ(n)
根据辗转相减法,我们有 gcd ⁡ ( i , n ) = gcd ⁡ ( n − i , n ) \gcd(i,n)=\gcd(n-i,n) gcd(i,n)=gcd(ni,n),这就意味着,当 gcd ⁡ ( i , n ) = 1 \gcd(i,n)=1 gcd(i,n)=1 时,必然有 gcd ⁡ ( n − i , n ) = 1 \gcd(n-i,n)=1 gcd(ni,n)=1。因此,当答案要加上 i i i 的贡献时,必然也会有 n − i n-i ni 的贡献,而 i + ( n − i ) = n i+(n-i)=n i+(ni)=n
又发现 ∑ i = 1 n [    gcd ⁡ ( i , n ) = 1    ] = φ ( n ) \sum\limits_{i=1}^n[\;\gcd(i,n)=1\;]=\varphi(n) i=1n[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=1nk(2i=1kni(2iφ(i)+[i=1])1)=k=1nki=1kni2φ(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=1nk×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} (fId2)(n)=dnf(d)Id2(dn)=dnd2φ(d)d2n2=n2dnφ(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 dnId2(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=1i3=i=1idiId2(d)f(di)=d=1nd2i=1dnf(i)=d=1nd2×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=1ni3=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)2d=2nd2×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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值