【莫比乌斯反演】[BZOJ2820]YY的GCD
题目描述:
求有多少数对(x,y)(1<=x<=n,1<=y<=m)满足gcd(x,y)为质数
首先枚举一个质数发现
那么设
那么现在预处理后面的
令当前的数为i,当前的最小质因数为p发现如果
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAXN = 10000000;
bool nprime[MAXN+10];
int pcnt, prime[MAXN+10], sum[MAXN+10], mu[MAXN+10];
void Init(int up = MAXN-1){
int tmp; mu[1] = 1;
for(int i=2;i<=up;i++){
if(!nprime[i]){
prime[++pcnt] = i, mu[i] = -1; sum[i] = 1;
}
for(int j=1;j<=pcnt&&(tmp = prime[j]*i) <= up;j++){
nprime[tmp] = true;
if(i % prime[j] == 0){
mu[tmp] = 0;
sum[tmp] = mu[i];
break;
}
mu[tmp] = -mu[i];
sum[tmp] = mu[i]-sum[i];
}
}
for(int i=2;i<=up;i++)
sum[i] += sum[i-1];
}
int main(){
Init();
int n, m, T;
long long ret;
scanf("%lld", &T);
while(T--){
scanf("%d %d", &n, &m);
if(n > m) swap(n, m);
ret = 0;
for(int i=1, nex;i<=n;i=nex+1){
nex = min(n/(n/i), m/(m/i));
ret += 1LL * (n/i) * (m/i) * (sum[nex] - sum[i-1]);
}
printf("%lld\n", ret);
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步