莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
$假设\gcd(x,y)=p,令\ x’=\dfrac{x}{p},y’=\dfrac{y}{p},则\gcd(x’,y’)=1$
$即求对于每个\ p,1\le x’,y’\le \dfrac{N}{p},有多少组\gcd(x’,y’)=1$
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e7 + 10;
int n;
int primes[N],cnt;
bool st[N];
int phi[N];
LL s[N];
void init(int n)
{
for(int i=2;i<=n;i++)
{
if(!st[i])
{
primes[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;primes[j]<=n/i;j++)
{
st[primes[j]*i]=true;
if(i%primes[j]==0)
{
phi[primes[j]*i]=phi[i]*primes[j];
break;
}
phi[primes[j]*i]=phi[i]*(primes[j]-1);
}
}
//求前缀和
for(int i=2;i<=n;i++) s[i]=s[i-1]+phi[i];
}
int main()
{
cin>>n;
init(n);
//对于每一个质数 p,都要处理 n / p 以内的所有数字的欧拉函数
LL res=0;
for(int i=0;i<cnt;i++)
{
int p=primes[i];
res+=s[n/p]*2+1;
}
cout<<res<<endl;
return 0;
}