[BZOJ 3994]约数个数和 莫比乌斯反演

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[BZOJ 3994]约数个数和 莫比乌斯反演相关的知识,希望对你有一定的参考价值。

自己是在是弱,看了半天才看懂题解

写公式实在是麻烦,搬家一份:

技术分享图片

技术分享图片

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define N 101000
#define pos(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
#define LL long long
int t,n,m;
int notprime[N],prime[N],mu[N];
LL f[N];
void get_mu(){
	notprime[1]=1;mu[1]=1;
	pos(i,2,N-10){
		if(!notprime[i]){
			prime[++prime[0]]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=prime[0]&&prime[j]*i<=N-10;j++){
			notprime[prime[j]*i]=1;
			if(i%prime[j]==0){
				mu[i*prime[j]]=0;
				break;
			}
			mu[i*prime[j]]=-mu[i];
		}
	}
	pos(i,1,N-10) mu[i]+=mu[i-1];
	pos(i,1,N-10){
		int last(0);
		for(int j=1;j<=i;j=last+1){
			last=i/(i/j);
			f[i]+=(i/j)*1ll*(last-(j-1));
		}
	}
}
LL get_ans(){
	int last(0);
	LL res(0);
	for(int i=1;i<=n;i=last+1){
		last=min(n/(n/i),m/(m/i));
		res+=f[n/i]*f[m/i]*(mu[last]-mu[i-1]);
	}
	return res;
}
int main(){
	scanf("%d",&t);
	get_mu();
	while(t--){
		scanf("%d%d",&n,&m);if(n>m) swap(n,m);
		printf("%lld\\n",get_ans());
	}
	return 0;
}

  

以上是关于[BZOJ 3994]约数个数和 莫比乌斯反演的主要内容,如果未能解决你的问题,请参考以下文章

[BZOJ 3994]约数个数和 莫比乌斯反演

bzoj3994[SDOI2015]约数个数和 莫比乌斯反演

[SDOI2015][bzoj3994] 约数个数和 [莫比乌斯反演]

BZOJ 39943994: [SDOI2015]约数个数和(莫比乌斯反演)

刷题BZOJ 3994 [SDOI2015]约数个数和

BZOJ_4176_Lucas的数论_杜教筛+莫比乌斯反演