[HAOI2011] Problem B(莫比乌斯反演)

[HAOI2011] Problem B

Statement

A n s = ∑ i = a b ∑ j = c d [ gcd ⁡ ( i , j ) = k ] Ans=\sum_{i=a}^b\sum_{j=c}^d[\gcd(i,j)=k] Ans=i=abj=cd[gcd(i,j)=k]

Solution

设: s ( a , b , c , d , k ) = ∑ i = a b ∑ j = b c [ gcd ⁡ ( i , j ) = k ] s(a,b,c,d,k)=\sum_{i=a}^b\sum_{j=b}^c[\gcd(i,j)=k] s(a,b,c,d,k)=i=abj=bc[gcd(i,j)=k]

考虑容斥可得 A n s = s ( a , b , c , d , k ) = s ( 1 , b , 1 , d ) − s ( 1 , b , 1 , c − 1 , k ) − s ( 1 , a − 1 , 1 , d , k ) + s ( 1 , a − 1 , 1 , c − 1 , k ) Ans=s(a,b,c,d,k)=s(1,b,1,d)-s(1,b,1,c-1,k)-s(1,a-1,1,d,k)+s(1,a-1,1,c-1,k) Ans=s(a,b,c,d,k)=s(1,b,1,d)s(1,b,1,c1,k)s(1,a1,1,d,k)+s(1,a1,1,c1,k).

我们考虑一个子问题 s ( 1 , i , 1 , j , k ) = ∑ i = 1 N ∑ j = 1 M [ gcd ⁡ ( i , j ) = k ] s(1,i,1,j,k)=\sum_{i=1}^N\sum_{j=1}^M[\gcd(i,j)=k] s(1,i,1,j,k)=i=1Nj=1M[gcd(i,j)=k].

式子化简后和YY的GCD式子是一致的.


设: f ( d ) = ∑ i = 1 N ∑ j = 1 M [ gcd ⁡ ( i , j ) = d ] f(d)=\sum_{i=1}^N\sum_{j=1}^M[\gcd(i,j)=d] f(d)=i=1Nj=1M[gcd(i,j)=d].

设: g ( d ) = ∑ d ∣ d ′ f ( d ′ ) = ∑ i = 1 N ∑ j = 1 M [ d ∣ i ] [ d ∣ j ] = ∑ i = 1 N [ d ∣ i ] ∑ i = 1 M [ d ∣ j ] = ∑ i = 1 N [ d ∣ i ] ⌊ M d ⌋ = ⌊ N d ⌋ ⋅ ⌊ M d ⌋ g(d)=\sum_{d|d'}f(d')=\sum_{i=1}^N\sum_{j=1}^M[d|i][d|j]=\sum_{i=1}^N[d|i]\sum_{i=1}^M[d|j]=\sum_{i=1}^N[d|i]\lfloor\frac{M}{d}\rfloor=\lfloor\frac{N}{d}\rfloor\cdot\lfloor\frac{M}{d}\rfloor g(d)=ddf(d)=i=1Nj=1M[di][dj]=i=1N[di]i=1M[dj]=i=1N[di]dM=dNdM.

则: f ( d ) = ∑ d ∣ d ′ μ ( d ′ d ) g ( d ′ ) f(d)=\sum_{d|d'}\mu(\frac{d'}{d})g(d') f(d)=ddμ(dd)g(d).

A n s = ∑ p ∈ p r i m e ∑ i = 1 N ∑ j = 1 N [ gcd ⁡ ( i , j ) = p ] Ans=\sum_{p\in prime}\sum_{i=1}^N\sum_{j=1}^N[\gcd(i,j)=p] Ans=pprimei=1Nj=1N[gcd(i,j)=p].

可得: A n s = ∑ p ∈ p r i m e f ( p ) Ans=\sum_{p\in prime}f(p) Ans=pprimef(p).
A n s = ∑ p ∈ p r i m e ∑ i = 1 N ∑ j = 1 N [ gcd ⁡ ( i , j ) = p ] = ∑ p ∈ p r i m e f ( p ) = ∑ p ∈ p r i m e ∑ p ∣ d min ⁡ { N , M } μ ( d p ) ⌊ N d ⌋ ⌊ M d ⌋ = ∑ d = 1 min ⁡ { N , M } ∑ p ∣ d 且 p ∈ p r i m e μ ( d p ) ⌊ N d ⌋ ⌊ M d ⌋ = ∑ d = 1 min ⁡ { N , M } ⌊ N d ⌋ ⌊ M d ⌋ ∑ p ∣ d 且 p ∈ p r i e m μ ( d p ) \begin{aligned}Ans&=\sum_{p\in prime}\sum_{i=1}^N\sum_{j=1}^N[\gcd(i,j)=p]\\ &=\sum_{p\in prime}f(p)\\ &=\sum_{p\in prime}\sum_{p|d}^{\min\{N,M\}}\mu(\frac{d}{p})\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\\ &=\sum_{d=1}^{\min\{N,M\}}\sum_{p|d且p\in prime}\mu(\frac{d}{p})\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\\ &=\sum_{d=1}^{\min\{N,M\}}\lfloor\frac{N}{d}\rfloor\lfloor\frac{M}{d}\rfloor\sum_{p|d且p\in priem}\mu(\frac{d}{p}) \end{aligned} Ans=pprimei=1Nj=1N[gcd(i,j)=p]=pprimef(p)=pprimepdmin{N,M}μ(pd)dNdM=d=1min{N,M}pdpprimeμ(pd)dNdM=d=1min{N,M}dNdMpdppriemμ(pd)
我们发现 ∑ p ∣ d 且 p ∈ p r i m e μ ( d p ) \sum\limits_{p|d且 p\in prime}\mu(\frac{d}{p}) pdpprimeμ(pd)是可以预处理的, 该部分我们枚举 p ∈ p r i m e p\in prime pprime即可, 时间复杂度是 O ( n log ⁡ log ⁡ n ) O(n\log\log n) O(nloglogn)的和 Eratosthenes \text{Eratosthenes} Eratosthenes筛法(埃拉托特尼筛法, 简称埃氏筛法)该部分时间复杂度和写法相似.

然后一次询问我们只需要用数论分块就可以将复杂度做到 O ( N log ⁡ log ⁡ N + T N ) O(N\log\log N+T\sqrt N) O(NloglogN+TN ).

Code

# include "iostream"
# include "cstdio"

using namespace std;

const int maxm=5e4+10;

int Mu[maxm],Prime[maxm],Cnt;
bool Visit[maxm];

void Init(int N){
	Mu[1]=1;
	register int i,j;
	for(i=2;i<=N;i++){
		if(!Visit[i]){
			Prime[++Cnt]=i;
			Mu[i]=-1;
		}
		for(j=1;j<=Cnt && Prime[j]*i<=N;j++){
			Visit[i*Prime[j]]=1;
			if(i%Prime[j]==0){Mu[Prime[j]*i]=0;break;}
			Mu[i*Prime[j]]=-Mu[i];
		}
	}
	for(i=2;i<=N;i++) Mu[i]+=Mu[i-1];
	return;
}

int Solve(int N,int M,int K){
	N/=K;M/=K;
	register int i,j,Ans=0;
	if(N>M) swap(N,M);
	for(i=1;i<=N;i=j+1){
		j=min(N/(N/i),M/(M/i));
		Ans+=(N/i)*(M/i)*(Mu[j]-Mu[i-1]);
	}
	return Ans;
}

int main(){
	register int T;
	int A,B,C,D,K;
	scanf("%d",&T);
	Init(5e4);
	while(T--){
		scanf("%d%d%d%d%d",&A,&B,&C,&D,&K);
		printf("%d\n",Solve(B,D,K)-Solve(B,C-1,K)-Solve(A-1,D,K)+Solve(A-1,C-1,K));
	}
	return 0;
}

Link

[1] Luogu P2522 [HAOI2021]Problem B

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值