[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=1∑n/di=1∑m/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;
}