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

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

把题目的柿子推一下:

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

由于 l c m ( i , j ) ∗ g c d ( i , j ) = i j lcm(i,j)*gcd(i,j)=ij lcm(i,j)gcd(i,j)=ij

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

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

= ∑ d = 1 n ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ ( d × i ) × ( d × j ) d [ g c d ( ( 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)为原来的 i i i ( d × j ) (d\times j) (d×j)为原来的 j j j。将分式化简, g c d ( d × i , d × j ) = d gcd(d\times i,d\times j)=d gcd(d×i,d×j)=d里同时约掉一个 d d d得:

= ∑ d = 1 n ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ d × i × j [ g c d ( 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],代入 [ g c d ( i , j ) = 1 ] [gcd(i,j)=1] [gcd(i,j)=1]得:

= ∑ d = 1 n d ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i × j ∑ k ∣ g c d ( 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)

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

= ∑ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ i × j [ k ∣ g c d ( 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 ∣ g c d ( i , j ) ] [k|gcd(i,j)] [kgcd(i,j)]即为 [ k ∣ i , k ∣ j ] [k|i,k|j] [ki,kj]

(1) = ∑ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) ∑ i = 1 ⌊ n d ⌋ i [ k ∣ i ] ∑ j = 1 ⌊ m d ⌋ 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 = 1 n [ k ∣ i ] \sum_{i=1}^n[k|i] i=1n[ki],也就是询问 1 1 1~ n n n这些数中有多少个数是 k k k的倍数,答案显然是 ⌊ n k ⌋ \lfloor \frac{n}{k} \rfloor kn

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

也就是吧所有 1 1 1~ n n n中所有是 k k k的倍数的数加起来,答案显然就是 1 × k + 2 × k + . . . + ⌊ n k ⌋ × k = ( 1 + 2 + . . . + ⌊ n k ⌋ ) × k = ( 1 + ⌊ n k ⌋ ) × ⌊ n k ⌋ × k 2 1\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 = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) × ( 1 + ⌊ ⌊ n d ⌋ k ⌋ ) × ⌊ ⌊ n d ⌋ k ⌋ × k 2 × ( 1 + ⌊ ⌊ m d ⌋ k ⌋ ) × ⌊ ⌊ m d ⌋ k ⌋ × k 2 =\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

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

= 1 4 ∑ d = 1 n d ∑ k = 1 ⌊ n d ⌋ μ ( k ) × k 2 × ( 1 + ⌊ n d k ⌋ ) × ⌊ n d k ⌋ × ( 1 + ⌊ m d k ⌋ ) × ⌊ m d k ⌋ =\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 = d k T=dk T=dk,我们枚举 T T T,并提到前面来。

= 1 4 ∑ T = 1 n ( 1 + ⌊ n T ⌋ ) × ⌊ n T ⌋ × ( 1 + ⌊ m T ⌋ ) × ⌊ m T ⌋ ∑ d ∣ T d × μ ( T d ) × T 2 d 2 = 1 4 ∑ T = 1 n ( 1 + ⌊ n T ⌋ ) × ⌊ n T ⌋ × ( 1 + ⌊ m T ⌋ ) × ⌊ m T ⌋ ∑ d ∣ T μ ( T d ) × T 2 d \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 = 1 n ( 1 + ⌊ n T ⌋ ) × ⌊ n T ⌋ × ( 1 + ⌊ m T ⌋ ) × ⌊ m T ⌋ 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} \rfloor f(T)=T=1n(1+Tn)×Tn×(1+Tm)×Tm

g ( T ) = ∑ d ∣ T μ ( T d ) × T 2 d g(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),由于 μ ( T d ) \mu(\frac{T}{d}) μ(dT)是积性函数, T 2 d \frac{T^2}{d} dT2是完全积性函数,所以 g ( T ) g(T) g(T)也是积性函数。

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

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

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

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

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

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

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

    μ ( T d ) × T 2 d = μ ( p ) × p 2 1 = − p 2 \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 μ ( T d ) × T 2 d = p − p 2 g(T)=\sum_{d|T}\mu(\frac{T}{d})\times\frac{T^2}{d}=p-p^2 g(T)=dTμ(dT)×dT2=pp2

  2. T = i ∗ p T=i*p T=ip,其中 p p p为质数, i ≠ 1 i\ne1 i̸=1 i % p ≠ 0 i\%p \ne 0 i%p̸=0,即 g c d ( i , p ) = 1 gcd(i,p)=1 gcd(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 ∗ p T=i*p T=ip,其中 p p p为质数, i ≠ 1 i\ne1 i̸=1 i % p = 0 i\%p = 0 i%p=0,即 g c d ( i , p ) = p gcd(i,p)=p gcd(i,p)=p,不妨设 i = t × p k i=t\times p^k i=t×pk

    考虑推出:

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

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

    分情况讨论解得:

    g ( p k ) = ∑ d ∣ p k μ ( p k d ) × p 2 k d = μ ( p k p k ) × p 2 k p k + μ ( p k p k − 1 ) × p 2 k p k − 1 = p k − p k + 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 ( p k + 1 ) = p k + 1 − p k + 2 g(p^{k+1})=p^{k+1}-p^{k+2} g(pk+1)=pk+1pk+2

    由上述2式可得:

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

    g ( T ) = g ( i × p ) = g ( t × p k × p ) = g ( t ) × g ( p k + 1 ) ( t 、 p 互质) = g ( t ) × g ( p k ) × p (结论(2)) = g ( t × p k ) × 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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值