【BZOJ2693】jzptab(莫比乌斯反演)

数学算法解析:最小公倍数之和的求解
本文深入探讨了求解两个数范围内所有整数对的最小公倍数之和的数学算法,通过巧妙地利用数学性质和数论技巧,将复杂问题转化为可快速解决的形式。文章详细解释了如何通过枚举、化简和线性筛等步骤,最终得出简洁高效的求解公式。

不妨先设n&lt;=mn&lt;=mn<=m

把题目的柿子推一下:

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

由于lcm(i,j)∗gcd(i,j)=ijlcm(i,j)*gcd(i,j)=ijlcm(i,j)gcd(i,j)=ij

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

d=gcd(i,j)d=gcd(i,j)d=gcd(i,j),我们枚举ddd,提到最前面,再枚举iiiddd的几倍、jjjddd的几倍。

=∑d=1n∑i=1⌊nd⌋∑j=1⌊md⌋(d×i)×(d×j)d[gcd((d×i),(d×j))=d]=\sum_{d=1}^{n}\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor}\frac{(d\times i)\times (d\times j)}{d}[gcd((d\times i),(d\times j))=d]=d=1ni=1dnj=1dmd(d×i)×(d×j)[gcd((d×i),(d×j))=d]

则在上面这个柿子中,(d×i)(d\times i)(d×i)为原来的iii(d×j)(d\times j)(d×j)为原来的jjj。将分式化简,gcd(d×i,d×j)=dgcd(d\times i,d\times j)=dgcd(d×i,d×j)=d里同时约掉一个ddd得:

=∑d=1n∑i=1⌊nd⌋∑j=1⌊md⌋d×i×j[gcd(i,j)=1]=\sum_{d=1}^{n}\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor}d\times i\times j[gcd(i,j)=1]=d=1ni=1dnj=1dmd×i×j[gcd(i,j)=1]

考虑到∑i∣nμ(i)=[n=1]\sum_{i|n}\mu(i)=[n=1]inμ(i)=[n=1],代入[gcd(i,j)=1][gcd(i,j)=1][gcd(i,j)=1]得:

=∑d=1nd∑i=1⌊nd⌋∑j=1⌊md⌋i×j∑k∣gcd(i,j)μ(k)=\sum_{d=1}^{n}d\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor} i\times j\sum_{k|gcd(i,j)}\mu(k)=d=1ndi=1dnj=1dmi×jkgcd(i,j)μ(k)

我们再次枚举kkk,提到∑d=1n\sum_{d=1}^nd=1n后:

=∑d=1nd∑k=1⌊nd⌋μ(k)∑i=1⌊nd⌋∑j=1⌊md⌋i×j[k∣gcd(i,j)]=\sum_{d=1}^n d\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor}i\times j[k|gcd(i,j)]=d=1ndk=1dnμ(k)i=1dnj=1dmi×j[kgcd(i,j)]

考虑到[k∣gcd(i,j)][k|gcd(i,j)][kgcd(i,j)]即为[k∣i,k∣j][k|i,k|j][ki,kj]

(1)=∑d=1nd∑k=1⌊nd⌋μ(k)∑i=1⌊nd⌋i[k∣i]∑j=1⌊md⌋j[k∣j]=\sum_{d=1}^n d\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}i[k|i]\sum_{j=1}^{\lfloor \frac{m}{d} \rfloor}j[k|j] \tag{1}=d=1ndk=1dnμ(k)i=1dni[ki]j=1dmj[kj](1)

这时我们先推另一个柿子:∑i=1n[k∣i]\sum_{i=1}^n[k|i]i=1n[ki],也就是询问111~nnn这些数中有多少个数是kkk的倍数,答案显然是⌊nk⌋\lfloor \frac{n}{k} \rfloorkn

但如果是求∑i=1ni[k∣i]\sum_{i=1}^ni[k|i]i=1ni[ki]呢?

也就是吧所有111~nnn中所有是kkk的倍数的数加起来,答案显然就是1×k+2×k+...+⌊nk⌋×k=(1+2+...+⌊nk⌋)×k=(1+⌊nk⌋)×⌊nk⌋×k21\times k+2\times k+...+\lfloor \frac{n}{k} \rfloor \times k=(1+2+...+\lfloor \frac{n}{k} \rfloor)\times k=\frac{(1+\lfloor \frac{n}{k} \rfloor)\times \lfloor \frac{n}{k} \rfloor \times k}{2}1×k+2×k+...+kn×k=(1+2+...+kn)×k=2(1+kn)×kn×k

把这个代入(1)(1)(1)

=∑d=1nd∑k=1⌊nd⌋μ(k)×(1+⌊⌊nd⌋k⌋)×⌊⌊nd⌋k⌋×k2×(1+⌊⌊md⌋k⌋)×⌊⌊md⌋k⌋×k2=\sum_{d=1}^n d\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)\times\frac{(1+\lfloor \frac{\lfloor \frac{n}{d} \rfloor}{k} \rfloor)\times \lfloor \frac{\lfloor \frac{n}{d} \rfloor}{k} \rfloor \times k}{2}\times\frac{(1+\lfloor \frac{\lfloor \frac{m}{d} \rfloor}{k} \rfloor)\times \lfloor \frac{\lfloor \frac{m}{d} \rfloor}{k} \rfloor \times k}{2}=d=1ndk=1dnμ(k)×2(1+kdn)×kdn×k×2(1+kdm)×kdm×k

化简一下这个难看的柿子:

=14∑d=1nd∑k=1⌊nd⌋μ(k)×k2×(1+⌊ndk⌋)×⌊ndk⌋×(1+⌊mdk⌋)×⌊mdk⌋=\frac{1}{4}\sum_{d=1}^n d\sum_{k=1}^{\lfloor \frac{n}{d} \rfloor}\mu(k)\times k^2\times(1+ \lfloor \frac{n}{dk} \rfloor)\times \lfloor \frac{n}{dk} \rfloor \times(1+ \lfloor \frac{m}{dk} \rfloor)\times \lfloor \frac{m}{dk} \rfloor=41d=1ndk=1dnμ(k)×k2×(1+dkn)×dkn×(1+dkm)×dkm

然后令T=dkT=dkT=dk,我们枚举TTT,并提到前面来。

=14∑T=1n(1+⌊nT⌋)×⌊nT⌋×(1+⌊mT⌋)×⌊mT⌋∑d∣Td×μ(Td)×T2d2=14∑T=1n(1+⌊nT⌋)×⌊nT⌋×(1+⌊mT⌋)×⌊mT⌋∑d∣Tμ(Td)×T2d\begin{aligned} &amp; =\frac{1}{4}\sum_{T=1}^{n}(1+ \lfloor \frac{n}{T} \rfloor)\times \lfloor \frac{n}{T} \rfloor \times(1+ \lfloor \frac{m}{T} \rfloor)\times \lfloor \frac{m}{T} \rfloor\sum_{d|T}d\times\mu(\frac{T}{d})\times\frac{T^2}{d^2}\\ &amp; =\frac{1}{4}\sum_{T=1}^{n}(1+ \lfloor \frac{n}{T} \rfloor)\times \lfloor \frac{n}{T} \rfloor \times(1+ \lfloor \frac{m}{T} \rfloor)\times \lfloor \frac{m}{T} \rfloor\sum_{d|T}\mu(\frac{T}{d})\times\frac{T^2}{d}\end{aligned}=41T=1n(1+Tn)×Tn×(1+Tm)×TmdTd×μ(dT)×d2T2=41T=1n(1+Tn)×Tn×(1+Tm)×TmdTμ(dT)×dT2

f(T)=∑T=1n(1+⌊nT⌋)×⌊nT⌋×(1+⌊mT⌋)×⌊mT⌋f(T)=\sum_{T=1}^{n}(1+ \lfloor \frac{n}{T} \rfloor)\times \lfloor \frac{n}{T} \rfloor \times(1+ \lfloor \frac{m}{T} \rfloor)\times \lfloor \frac{m}{T} \rfloorf(T)=T=1n(1+Tn)×Tn×(1+Tm)×Tm

g(T)=∑d∣Tμ(Td)×T2dg(T)=\sum_{d|T}\mu(\frac{T}{d})\times\frac{T^2}{d}g(T)=dTμ(dT)×dT2

那么显然,对于f(T)f(T)f(T),我们可以用数论分块做出来。

而对于g(T)g(T)g(T),由于μ(Td)\mu(\frac{T}{d})μ(dT)是积性函数,T2d\frac{T^2}{d}dT2是完全积性函数,所以g(T)g(T)g(T)也是积性函数。

那么对于g(T)g(T)g(T),我们在线性筛时分三种情况讨论:

  1. T=pT=pT=p,其中ppp为质数,那么我们再看回这个柿子:

    g(T)=∑d∣Tμ(Td)×T2dg(T)=\sum_{d|T}\mu(\frac{T}{d})\times\frac{T^2}{d}g(T)=dTμ(dT)×dT2

    明显,由于μ\muμ的定义,所以当且仅当Td=1\frac{T}{d}=1dT=1Td=p\frac{T}{d}=pdT=p时才能产生贡献,使μ(Td)≠0\mu(\frac{T}{d})\ne0μ(dT)̸=0

    Td=1\frac{T}{d}=1dT=1,则T=d=pT=d=pT=d=p

    μ(Td)×T2d=μ(1)×p2p=p\mu(\frac{T}{d})\times\frac{T^2}{d}=\mu(1)\times\frac{p^2}{p}=pμ(dT)×dT2=μ(1)×pp2=p

    Td=p\frac{T}{d}=pdT=p,又T=pT=pT=p,则d=1d=1d=1

    μ(Td)×T2d=μ(p)×p21=−p2\mu(\frac{T}{d})\times\frac{T^2}{d}=\mu(p)\times\frac{p^2}{1}=-p^2μ(dT)×dT2=μ(p)×1p2=p2

    合并起来,即为

    g(T)=∑d∣Tμ(Td)×T2d=p−p2g(T)=\sum_{d|T}\mu(\frac{T}{d})\times\frac{T^2}{d}=p-p^2g(T)=dTμ(dT)×dT2=pp2

  2. T=i∗pT=i*pT=ip,其中ppp为质数,i≠1i\ne1i̸=1i%p≠0i\%p \ne 0i%p̸=0,即gcd(i,p)=1gcd(i,p)=1gcd(i,p)=1。那么g(T)=g(i)×g(p)g(T)=g(i)\times g(p)g(T)=g(i)×g(p)

  3. T=i∗pT=i*pT=ip,其中ppp为质数,i≠1i\ne1i̸=1i%p=0i\%p = 0i%p=0,即gcd(i,p)=pgcd(i,p)=pgcd(i,p)=p,不妨设i=t×pki=t\times p^ki=t×pk

    考虑推出:

    g(pk)=∑d∣pkμ(pkd)×p2kdg(p^k)=\sum_{d|{p^k}}\mu(\frac{p^k}{d})\times\frac{p^{2k}}{d}g(pk)=dpkμ(dpk)×dp2k

    根据μ\muμ的定义,当且仅当pkd=1\frac{p^k}{d}=1dpk=1pkd=p\frac{p^k}{d}=pdpk=p时才能产生贡献,使μ(pkd)≠0\mu(\frac{p^k}{d})\ne0μ(dpk)̸=0

    分情况讨论解得:

    g(pk)=∑d∣pkμ(pkd)×p2kd=μ(pkpk)×p2kpk+μ(pkpk−1)×p2kpk−1=pk−pk+1 \begin{aligned} g(p^k) &amp; =\sum_{d|{p^k}}\mu(\frac{p^k}{d})\times\frac{p^{2k}}{d}\\ &amp; =\mu(\frac{p^k}{p^k})\times \frac{p^{2k}}{p^k}+\mu(\frac{p^k}{p^{k-1}})\times\frac{p^{2k}}{p^{k-1}}\\ &amp; =p^k-p^{k+1} \end{aligned} g(pk)=dpkμ(dpk)×dp2k=μ(pkpk)×pkp2k+μ(pk1pk)×pk1p2k=pkpk+1

    同理,我们可以推得:

    g(pk+1)=pk+1−pk+2g(p^{k+1})=p^{k+1}-p^{k+2}g(pk+1)=pk+1pk+2

    由上述2式可得:

    (2)g(pk+1)=g(pk)×pg(p^{k+1})=g(p^k)\times p \tag{2}g(pk+1)=g(pk)×p(2)

    g(T)=g(i×p)=g(t×pk×p)=g(t)×g(pk+1)(t、p互质)=g(t)×g(pk)×p(结论(2))=g(t×pk)×p(t、p互质)=g(i)×p \begin{aligned} g(T) &amp; =g(i\times p)\\ &amp; =g(t\times p^k \times p)\\ &amp; =g(t)\times g(p^{k+1})\text{($t$、$p$互质)}\\ &amp; =g(t)\times g(p^k)\times p\text{(结论(2))}\\ &amp; =g(t\times p^k)\times p\text{($t$、$p$互质)}\\ &amp; =g(i)\times p \end{aligned} g(T)=g(i×p)=g(t×pk×p)=g(t)×g(pk+1)tp互质)=g(t)×g(pk)×p(结论(2)=g(t×pk)×ptp互质)=g(i)×p

那么我们可以分3种情况讨论,线性求出每一个g(T)g(T)g(T),再维护一下g(T)g(T)g(T)的前缀和就好了。

最后的代码如下:

#include<bits/stdc++.h>

#define N 10000010
#define ll long long
#define mod 100000009

using namespace std;

int t,n,m,cnt;
ll prime[N],g[N],sum[N];
bool notprime[N];

void work()
{
	int maxn=N-10;
	g[1]=1;//记得初始化
	for(int i=2;i<=maxn;i++)
	{
		if(!notprime[i])
		{
			prime[++cnt]=i;
			g[i]=((i-1ll*i*i)%mod+mod)%mod;//第一种情况:T=p
		}
		for(int j=1;j<=cnt&&i*prime[j]<=maxn;j++)
		{
			notprime[i*prime[j]]=true;
			if(!(i%prime[j]))
			{
				g[i*prime[j]]=g[i]*prime[j]%mod;//第二种情况:T=i%p且i%p=0
				break;
			}
			g[i*prime[j]]=g[i]*g[prime[j]]%mod;//第三种情况:T=i%p且i%p!=0
		}
	}
	for(int i=1;i<=maxn;i++)
		sum[i]=(sum[i-1]+g[i])%mod;//维护前缀和
}

ll query(int n,int m)
{
	ll ans=0;
	for(int l=1,r=0;l<=n;l=r+1)//数论分块
	{
		r=min(n/(n/l),m/(m/l));
		ll x=n/l,y=m/l;
		ans=(ans+(((1ll+x)*x/2ll%mod)*((1ll+y)*y/2%mod)%mod)*(sum[r]-sum[l-1])%mod)%mod;
	}
	return ans;
}

int main()
{
	work();//线性筛
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d",&n,&m);
		if(n>m)swap(n,m);
		printf("%lld\n",(query(n,m)%mod+mod)%mod);
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值