AcWing 220. 最大公约数
给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对。
GCD(x,y)即求x,y的最大公约数。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 1e7 + 233; int primes[maxn], mu[maxn], sum[maxn], cnt; bool st[maxn]; void get_primes(int n) { mu[1] = 1; sum[1] = 1; for(int i = 2; i <= n; i++) { if(!st[i]) primes[cnt++] = i, mu[i] = -1; sum[i] = sum[i - 1] + mu[i]; for(int j = 0; j < cnt && i * primes[j] <= n; j++) { st[primes[j] * i] = 1; if(i % primes[j] == 0) { mu[primes[j]*i]=0; break; } else mu[primes[j]*i]=-mu[i]; } } } int main() { get_primes(10000000); int n;cin>>n; ll ans=0; for(int j=0;j<cnt&&primes[j]<=n;j++) { int a=n/primes[j],c=0; for(int i=1;i<=a;i=c+1) { c=n/(n/i); ll b=i*primes[j]; ll t=(n/b)*(n/b); ans+=(ll)(sum[c]-sum[i-1])*t; } } cout<<ans; }
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e7 + 233;
int primes[maxn], mu[maxn], sum[maxn], cnt;
bool st[maxn];
void get_primes(int n)
{
mu[1] = 1; sum[1] = 1;
for(int i = 2; i <= n; i++)
{
if(!st[i]) primes[cnt++] = i, mu[i] = -1;
sum[i] = sum[i - 1] + mu[i];
for(int j = 0; j < cnt && i * primes[j] <= n; j++)
{
st[primes[j] * i] = 1;
if(i % primes[j] == 0)
{
mu[primes[j]*i]=0;
break;
}
else mu[primes[j]*i]=-mu[i];
}
}
}
int main()
{
get_primes(10000000);
int n;cin>>n;
ll ans=0;
for(int j=0;j<cnt&&primes[j]<=n;j++)
{
int a=n/primes[j],c=0;
for(int i=1;i<=a;i=c+1)
{
c=n/(n/i);
ll b=i*primes[j];
ll t=(n/b)*(n/b);
ans+=(ll)(sum[c]-sum[i-1])*t;
}
}
cout<<ans;
}