给定整数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;
}