题意就不描述了,毕竟题号都给了
这题是一道赤裸裸的欧拉函数应用题
设p为质数
gcd(ap,bp)= p 等价于 gcd(a,b)=1
所以问题等价于对于所有的质数p[i],求当1<=x,y<=n/p[i],所有gcd(x,y)=1的(x,y)的个数
这不是欧拉函数吗?
符合条件的(x,y)的个数为 //(x,y)(y,x)两种,但是还要减去当x=y的情况
所以前缀和一下轻松ac
抄代码是不好的哟
#include<cstdio>
using namespace std;
const int N=1e7+5;
int n;
int p[N],cnt;
long long f[N];
bool fl[N];
inline int read()
{
char ch=getchar(); int ret=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9')
ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar();
return ret;
}
inline void Prime()
{
for(int i=1;i<=n;i++) fl[i]=0;
f[1]=1; cnt=0;
for(int i=2;i<=n;i++)
{
if(!fl[i])
p[++cnt]=i,f[i]=i-1;
for(int j=1;j<=cnt;j++)
{
if(p[j]*i>n) break;
fl[p[j]*i]=1;
if(i%p[j]!=0) f[p[j]*i]=f[p[j]]*f[i];
else
{
f[p[j]*i]=p[j]*f[i];
break;
}
}
}
}
int main()
{
n=read();
Prime();
for(int i=2;i<=n;i++) f[i]=f[i-1]+f[i];
long long ans=0;
for(int i=1;i<=cnt;i++)
ans+=f[n/p[i]]+f[n/p[i]]-1;
printf("%lld\n",ans);
return 0;
}