51nod 1238 最小公倍数之和 V3

背景:

luogu P1829  \text{luogu P1829 } luogu P1829 [国家集训队]Crash的数字表格 / JZPTAB的加强版。

题目传送门:

http://www.51nod.com/Challenge/Problem.html#!#problemId=1238

题意:

你可以认为以下的 n = m n=m n=m
∑ i = 1 n ∑ j = 1 m lcm ( i , j ) \sum_{i=1}^{n}\sum_{j=1}^{m}\text{lcm}(i,j) i=1nj=1mlcm(i,j)

思路:

∑ i = 1 n ∑ j = 1 m lcm ( i , j ) \sum_{i=1}^{n}\sum_{j=1}^{m}\text{lcm}(i,j) i=1nj=1mlcm(i,j)

= ∑ i = 1 n ∑ j = 1 m i j gcd ⁡ ( i , j ) =\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{\gcd(i,j)} =i=1nj=1mgcd(i,j)ij

你设一个 k k k枚举 g c d ( i , j ) gcd(i,j) gcd(i,j)
= ∑ k = 1 min ⁡ ( n , m ) ∑ i = 1 n ∑ j = 1 m i j gcd ⁡ ( i , j ) [ gcd ⁡ ( i , j ) = k ] =\sum_{k=1}^{\min(n,m)}\sum_{i=1}^{n}\sum_{j=1}^{m}\frac{ij}{\gcd(i,j)}[\gcd(i,j)=k] =k=1min(n,m)i=1nj=1mgcd(i,j)ij[gcd(i,j)=k]

搞掉那一个 k k k,得:
= ∑ k = 1 min ⁡ ( n , m ) ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ k 2 i j k [ gcd ⁡ ( i , j ) = 1 ] =\sum_{k=1}^{\min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}k^2\frac{ij}{k}[\gcd(i,j)=1] =k=1min(n,m)i=1dnj=1dmk2kij[gcd(i,j)=1]

化简一下,得:
= ∑ k = 1 min ⁡ ( n , m ) ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i j k [ gcd ⁡ ( i , j ) = 1 ] =\sum_{k=1}^{\min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ijk[\gcd(i,j)=1] =k=1min(n,m)i=1dnj=1dmijk[gcd(i,j)=1]

再套一个 ∑ d ∣ n μ d = [ n = 1 ] \sum_{d|n}\mu_d=[n=1] dnμd=[n=1],得:
= ∑ k = 1 min ⁡ ( n , m ) ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i j k ∑ d ∣ gcd ⁡ ( i , j ) μ d =\sum_{k=1}^{\min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ijk\sum_{d|\gcd(i,j)}\mu_d =k=1min(n,m)i=1dnj=1dmijkdgcd(i,j)μd

搞一下 d d d的枚举方式,得:
= ∑ k = 1 min ⁡ ( n , m ) ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i j k ∑ d = 1 min ⁡ ( ⌊ n d ⌋ , ⌊ m d ⌋ ) μ d [ d ∣ gcd ⁡ ( i , j ) ] =\sum_{k=1}^{\min(n,m)}\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ijk\sum_{d=1}^{\min(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}\mu_d[d|\gcd(i,j)] =k=1min(n,m)i=1dnj=1dmijkd=1min(dn,dm)μd[dgcd(i,j)]

前置一下 d d d,得:
= ∑ k = 1 min ⁡ ( n , m ) ∑ d = 1 min ⁡ ( ⌊ n d ⌋ , ⌊ m d ⌋ ) μ d ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i j k [ d ∣ gcd ⁡ ( i , j ) ] =\sum_{k=1}^{\min(n,m)}\sum_{d=1}^{\min(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}\mu_d\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}ijk[d|\gcd(i,j)] =k=1min(n,m)d=1min(dn,dm)μdi=1dnj=1dmijk[dgcd(i,j)]

更换一下枚举项,从而消除判断条件,得:
= ∑ k = 1 min ⁡ ( n , m ) ∑ d = 1 min ⁡ ( ⌊ n d ⌋ , ⌊ m d ⌋ ) μ d ∑ i = 1 ⌊ n k d ⌋ ∑ j = 1 ⌊ m k d ⌋ i j k d 2 =\sum_{k=1}^{\min(n,m)}\sum_{d=1}^{\min(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}\mu_d\sum_{i=1}^{\lfloor\frac{n}{kd}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{kd}\rfloor}ijkd^2 =k=1min(n,m)d=1min(dn,dm)μdi=1kdnj=1kdmijkd2

k , d 2 k,d^2 k,d2置:
= ∑ k = 1 min ⁡ ( n , m ) ∑ d = 1 min ⁡ ( ⌊ n d ⌋ , ⌊ m d ⌋ ) μ d d 2 k ∑ i = 1 ⌊ n k d ⌋ ∑ j = 1 ⌊ m k d ⌋ i j =\sum_{k=1}^{\min(n,m)}\sum_{d=1}^{\min(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}\mu_dd^2k\sum_{i=1}^{\lfloor\frac{n}{kd}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{kd}\rfloor}ij =k=1min(n,m)d=1min(dn,dm)μdd2ki=1kdnj=1kdmij

S = ∑ i = 1 n ∑ i = 1 n i j S=\sum_{i=1}^n\sum_{i=1}^{n}ij S=i=1ni=1nij
因为 ∑ i = 1 n ∑ i = 1 n i j = n ( n + 1 ) 2 \sum_{i=1}^n\sum_{i=1}^{n}ij=\frac{n(n+1)}{2} i=1ni=1nij=2n(n+1)
所以有: S = n ( n + 1 ) 2 S=\frac{n(n+1)}{2} S=2n(n+1)

则上式变为:
= ∑ k = 1 min ⁡ ( n , m ) ∑ d = 1 min ⁡ ( ⌊ n d ⌋ , ⌊ m d ⌋ ) μ d d 2 k S ⌊ n k d ⌋ S ⌊ m k d ⌋ =\sum_{k=1}^{\min(n,m)}\sum_{d=1}^{\min(\lfloor\frac{n}{d}\rfloor,\lfloor\frac{m}{d}\rfloor)}\mu_dd^2kS_{\lfloor\frac{n}{kd}\rfloor}S_{\lfloor\frac{m}{kd}\rfloor} =k=1min(n,m)d=1min(dn,dm)μdd2kSkdnSkdm
现在就可以 Θ ( n n ) \Theta(n\sqrt{n}) Θ(nn )出解了。


你发现式子太长了,不和谐,于是用 T = k d T=kd T=kd代替一下,同时 i = k , j = d i=k,j=d i=k,j=d,得:
= ∑ T = 1 min ⁡ ( n , m ) S ⌊ n T ⌋ S ⌊ m T ⌋ ∑ i j = T i j 2 μ j =\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}\sum_{ij=T}ij^2\mu_j =T=1min(n,m)STnSTmij=Tij2μj

因为 i j = T ij=T ij=T,所以有:
= ∑ T = 1 min ⁡ ( n , m ) S ⌊ n T ⌋ S ⌊ m T ⌋ ∑ i j = T T j μ j =\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}\sum_{ij=T}Tj\mu_j =T=1min(n,m)STnSTmij=TTjμj

w o c woc woc后面的式子 i i i不见了,那就等价于 j ∣ T j|T jT,得:
= ∑ T = 1 min ⁡ ( n , m ) S ⌊ n T ⌋ S ⌊ m T ⌋ ∑ j ∣ T T j μ j =\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}\sum_{j|T}Tj\mu_j =T=1min(n,m)STnSTmjTTjμj

等价于:
= ∑ T = 1 min ⁡ ( n , m ) S ⌊ n T ⌋ S ⌊ m T ⌋ ⋅ i d T ⋅ ∑ j ∣ T i d j ⋅ μ j =\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}·id_T·\sum_{j|T}id_j·\mu_j =T=1min(n,m)STnSTmidTjTidjμj

由于一个数 × 1 \times1 ×1得原数,因此等价于:
= ∑ T = 1 min ⁡ ( n , m ) S ⌊ n T ⌋ S ⌊ m T ⌋ ⋅ i d T ⋅ ∑ j ∣ T i d j ⋅ μ j ⋅ I T j =\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}·id_T·\sum_{j|T}id_j·\mu_j·I_{\frac{T}{j}} =T=1min(n,m)STnSTmidTjTidjμjIjT

等价于:
= ∑ T = 1 min ⁡ ( n , m ) S ⌊ n T ⌋ S ⌊ m T ⌋ ⋅ ( i d ⋅ ( i d ⋅ μ ∗ I ) ) ( T ) =\sum_{T=1}^{\min(n,m)}S_{\lfloor\frac{n}{T}\rfloor}S_{\lfloor\frac{m}{T}\rfloor}·(id·(id·\mu*I))(T) =T=1min(n,m)STnSTm(id(idμI))(T)


考虑 i d ⋅ ( i d ⋅ μ ∗ I ) id·(id·\mu*I) id(idμI)怎么杜教筛。
i d ⋅ ( ( i d ⋅ μ ) ∗ I ) id·((id·\mu)*I) id((idμ)I)

A A A为完全积性函数,有 A ⋅ ( B ∗ C ) = A ⋅ B ∗ A ⋅ C A·(B*C)=A·B*A·C A(BC)=ABAC,所以将 ( i d ⋅ μ ) (id·\mu) (idμ)看为一个整体,有:
= ( i d ⋅ μ ⋅ i d ) ∗ ( I ⋅ i d ) =(id·\mu·id)*(I·id) =(idμid)(Iid)

= ( i d 2 ⋅ μ ) ∗ ( I ⋅ i d ) =(id^2·\mu)*(I·id) =(id2μ)(Iid)

我们选择 i d 2 id^2 id2进行狄利克雷卷积。

f = ( i d 2 ⋅ μ ) ∗ ( I ⋅ i d ) f=(id^2·\mu)*(I·id) f=(id2μ)(Iid) g = i d 2 g=id^2 g=id2 S u m = ∑ f Sum=\sum{f} Sum=f,则有:
考虑 f ∗ g = ( i d 2 ⋅ μ ) ∗ ( I ⋅ i d ) ∗ i d 2 = f ∗ g = ( i d 2 ⋅ μ ) ∗ i d ∗ i d 2 f*g=(id^2·\mu)*(I·id)*id^2=f*g=(id^2·\mu)*id*id^2 fg=(id2μ)(Iid)id2=fg=(id2μ)idid2
因为狄利克雷卷积满足交换律,因此有: f ∗ g = ( i d 2 ⋅ μ ) ∗ i d 2 ∗ i d f*g=(id^2·\mu)*id^2*id fg=(id2μ)id2id

( ( i d 2 ⋅ μ ) ∗ i d 2 ) ( i ) ((id^2·\mu)*id^2)(i) ((id2μ)id2)(i)
∑ j ∣ i j 2 ⋅ μ j ⋅ ( n j ) 2 \sum_{j|i}j^2·\mu_j·(\frac{n}{j})^2 jij2μj(jn)2
∑ j ∣ i n 2 ⋅ μ j \sum_{j|i}n^2·\mu_j jin2μj
= n 2 ∑ j ∣ i ⋅ μ j =n^2\sum_{j|i}·\mu_j =n2jiμj
= n 2 [ n = 1 ] =n^2[n=1] =n2[n=1]
= 1 =1 =1

( ( i d 2 ⋅ μ ) ∗ i d 2 ) ( i ) = I ((id^2·\mu)*id^2)(i)=I ((id2μ)id2)(i)=I,带回去,得到:
f ∗ g = ( i d 2 ⋅ μ ) ∗ i d 2 ∗ i d = I ∗ i d = i d f*g=(id^2·\mu)*id^2*id=I*id=id fg=(id2μ)id2id=Iid=id

杜教筛是这么处理积性函数的:
g ( 1 ) ∗ S u m ( n ) = ∑ i = 1 n ( f ∗ g ) ( i ) − ∑ i = 2 n g ( i ) S u m ( ⌊ n i ⌋ ) g(1)*Sum(n)=\sum_{i=1}^{n}(f*g)(i)-\sum_{i=2}^{n}g(i)Sum(\lfloor\frac{n}{i} \rfloor) g(1)Sum(n)=i=1n(fg)(i)i=2ng(i)Sum(in)

= ∑ i = 1 n i − ∑ i = 2 n i 2 S u m ( ⌊ n i ⌋ ) =\sum_{i=1}^{n}i-\sum_{i=2}^{n}i^2Sum(\lfloor\frac{n}{i} \rfloor) =i=1nii=2ni2Sum(in)

= n ( n + 1 ) 2 − ∑ i = 2 n i 2 S u m ( ⌊ n i ⌋ ) =\frac{n(n+1)}{2}-\sum_{i=2}^{n}i^2Sum(\lfloor\frac{n}{i} \rfloor) =2n(n+1)i=2ni2Sum(in)

现在可以整除分块了,自然就可以杜教筛了。


考虑如何线性筛。
( f ) ( 1 ) = ( i d 2 ⋅ μ ) ∗ i d (f)(1)=(id^2·\mu)*id (f)(1)=(id2μ)id
= 1 =1 =1

p ∈ p r i m e p∈prime pprime
( f ) ( p ) = ( i d 2 ⋅ μ ) ∗ i d (f)(p)=(id^2·\mu)*id (f)(p)=(id2μ)id
= ∑ i ∣ p i d i 2 ⋅ μ i ⋅ i d p i =\sum_{i|p}id_i^2·\mu_i·id_{\frac{p}i} =ipidi2μiidip
= ∑ i ∣ p i 2 ⋅ μ i ⋅ p i =\sum_{i|p}i^2·\mu_i·\frac{p}{i} =ipi2μiip
= ∑ i ∣ p i p μ i =\sum_{i|p}ip\mu_i =ipipμi
= p − p 2 =p-p^2 =pp2
= p ( 1 − p ) =p(1-p) =p(1p)

( f ) ( p k ) = ( i d 2 ⋅ μ ) ∗ i d (f)(p^k)=(id^2·\mu)*id (f)(pk)=(id2μ)id
= ∑ i ∣ p k i d i 2 ⋅ μ i ⋅ i d p i =\sum_{i|p^k}id_i^2·\mu_i·id_{\frac{p}i} =ipkidi2μiidip
= ∑ i ∣ p k i 2 ⋅ μ i ⋅ p k i =\sum_{i|p^k}i^2·\mu_i·\frac{p^k}{i} =ipki2μiipk
= ∑ i ∣ p k i p k μ i =\sum_{i|p^k}ip^k\mu_i =ipkipkμi
= p k − p k + 1 =p^k-p^{k+1} =pkpk+1
= p k ( 1 − p ) =p^k(1-p) =pk(1p)

可以 Θ ( 1 ) \Theta(1) Θ(1)求,就可以线性筛了。

代码:

#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#define LL long long
#define MAXN 10000000
#define mod 1000000007
#define inv2 500000004
#define inv6 166666668
using namespace std;
	LL n;
	int t=0;
	int prime[MAXN],low[MAXN];
	LL f[MAXN];
	bool bz[MAXN];
void init(int ma)
{
	f[0]=0,f[1]=1;
	bz[0]=bz[1]=true;
	for(int i=2;i<=ma;i++)
	{
		if(!bz[i]) prime[++t]=low[i]=i,f[i]=((LL)i*(1-i)%mod+mod)%mod;
		for(int j=1;j<=t&&i*prime[j]<=ma;j++)
		{
			bz[i*prime[j]]=true;
			if(!(i%prime[j]))
			{
				low[i*prime[j]]=low[i]*prime[j];
				if(low[i]==i)
					f[i*prime[j]]=((((1ll-prime[j])*i%mod+mod)%mod)*prime[j]%mod+mod)%mod;
				else
					f[i*prime[j]]=(f[i/low[i]]*f[low[i]*prime[j]]%mod+mod)%mod;
				break;
			}
			f[i*prime[j]]=f[i]*f[prime[j]]%mod;
			low[i*prime[j]]=prime[j];
		}
	}
	for(int i=1;i<=ma;i++)
		f[i]=(f[i]+f[i-1]+mod)%mod;
}
LL calc_2(LL x)
{
	x%=mod;
	return x*(x+1)%mod*inv2%mod;
}
LL calc_6(LL x)
{
	x%=mod;
	return x*(x+1)%mod*(2*x+1)%mod*inv6%mod;
}
map<LL,LL> Sum;
LL calc(LL n)
{
	if(n<=MAXN-10) return f[n];
	{
		map<LL,LL>::iterator t=Sum.find(n);
		if(t!=Sum.end()) return t->second;
	}
	LL ans=calc_2(n);
	for(LL l=2,r;l<=n;l=r+1)
	{
		r=n/(n/l);
		ans=(ans-(calc_6(r)-calc_6(l-1)+mod)%mod*calc(n/l)%mod+mod)%mod;
	}
	return Sum[n]=ans;
}
LL work()
{
	LL ans=0;
	for(LL l=1,r;l<=n;l=r+1)
	{
		r=n/(n/l);
		ans=(ans+calc_2(n/l)*calc_2(n/l)%mod*(calc(r)-calc(l-1)+mod)%mod)%mod;
	}
	return ans;
}
LL dg(LL x,LL k)
{
	if(!k) return 1;
	LL op=dg(x,k>>1);
	if(k&1) return op*op%mod*x%mod; else return op*op%mod;
}
int main()
{
	scanf("%lld",&n);
	init(MAXN-10);
	printf("%lld",work());
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值