BZOJ P2301 [HAOI2011] Problem b【莫比乌斯】

f ( n , m ) = ∑ i = 1 n ∑ j = 1 m ( g c d ( i , j ) = = k ) = ∑ i = 1 n k ∑ j = 1 m k ( g c d ( i , j ) = = 1 ) = ∑ i = 1 n k ∑ j = 1 m k ∑ d ∣ i , d ∣ j μ ( d ) = ∑ d ∣ i , d ∣ j μ ( d ) ∑ i = 1 n k ∑ j = 1 m k = ∑ d = 1 m i n ( n k , m k ) μ ( d ) ∑ i = 1 n d k ∑ j = 1 m d k = ∑ d = 1 m i n ( n k , m k ) μ ( d ) ⌊ n d k ⌋ ∗ ⌊ m d k ⌋ A n s = f ( b , d ) + f ( a − 1 , c − 1 ) − f ( a − 1 , b ) − f ( b , c − 1 ) f(n,m)=\sum_{i=1}^n\sum_{j=1}^m(gcd(i,j)==k)\\=\sum_{i=1}^{\frac{n}{k}}\sum_{j=1}^{\frac{m}{k}}(gcd(i,j)==1)\\=\sum_{i=1}^{\frac{n}{k}}\sum_{j=1}^{\frac{m}{k}}\sum_{d|i,d|j}μ(d)\\=\sum_{d|i,d|j}μ(d)\sum_{i=1}^{\frac{n}{k}}\sum_{j=1}^{\frac{m}{k}}\\=\sum_{d=1}^{min(\frac{n}{k},\frac{m}{k})}μ(d)\sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{m}{dk}}\\=\sum_{d=1}^{min(\frac{n}{k},\frac{m}{k})}μ(d)⌊\frac{n}{dk}⌋*⌊\frac{m}{dk}⌋\\Ans=f(b,d)+f(a-1,c-1)-f(a-1,b)-f(b,c-1) f(n,m)=i=1nj=1m(gcd(i,j)==k)=i=1knj=1km(gcd(i,j)==1)=i=1knj=1kmdi,djμ(d)=di,djμ(d)i=1knj=1km=d=1min(kn,km)μ(d)i=1dknj=1dkm=d=1min(kn,km)μ(d)dkndkmAns=f(b,d)+f(a1,c1)f(a1,b)f(b,c1)
由于直接计算 f f f时间复杂度仍然高,但是结合 μ ( d ) μ(d) μ(d)的性质我们发现其实可以对 μ ( d ) μ(d) μ(d)做一个前缀和优化一下。

void Mobius(){
	......
}
LL GetAns(LL N,LL M,LL K){
	LL I,Ans=0,Last;
	N/=K,M/=K;
	if(N>M){
		swap(N,M);
	}
	for(I=1;I<=N;I=Last+1){
		Last=min(N/(N/I),M/(M/I));
		Ans+=(Miu[J]-Miu[I-1])*(N/I)*(M/I);
	}
	return Ans;
}
int main(){
	LL I,J,K;
	N=Read();Mobius();
	for(I=1;I<=N;I++){
		A=Read(),B=Read(),C=Read(),D=Read(),K=Read();
		Ans=GetAns(B,D,K)-GetAns(A-1,D,K)-GetAns(B,C-1,K)+GetAns(A-1,C-1,K);
		......
	}	
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值