[luogu P4450] 双亲数

[luogu P4450] 双亲数
就当复习一下莫比乌斯反演吧
首先肯定是把d除掉,然后就变成了
∑ i = 1 n / d ∑ i = 1 m / d g c d ( i , j ) = = 1 \sum\limits_{i=1}^{n/d}\sum\limits_{i=1}^{m/d} gcd(i,j)==1 i=1n/di=1m/dgcd(i,j)==1
按照套路做即可
code:

#include<bits/stdc++.h>
#define N 1000005
using namespace std;
long long vis[N], mu[N], prime[N], sz;
void get_mu(){
	vis[1] = 1, mu[1] = 1;
	for(int i = 2; i < N; i ++){
		if(!vis[i]){
			prime[++ sz] = i;
			mu[i] = -1;
		}
		for(int j = 1; j <= sz && prime[j] * i < N; j ++){
			vis[i * prime[j]] = 1;
			if(i % prime[j] == 0) break;
			mu[i * prime[j]] = -mu[i];
		}
	}
}
int n, m, d;
int main(){
	get_mu();
	scanf("%d%d%d", &n, &m, &d);
	n /= d, m /= d;
	long long ans = 0;
	for(int i = 1; i <= min(n, m); i ++) 
		ans += 1ll * mu[i] * (n / i) * (m / i);
	printf("%lld", ans);
	return 0;
}
posted @ 2020-11-06 11:17  lahlah  阅读(37)  评论(0编辑  收藏  举报