LJJ爱数数(莫比乌斯反演)
题意:
给定\(n\),求满足\(\frac{1}{a}+\frac{1}{b}=\frac{1}{c}\),且\(a,b,c\)互质的三元组\((a,b,c)\)数目。\((a,b,c\leq n)\)
\(n\leq10^{12}\)
首先,使用类似P5253 丢番图 的方法,两边乘以\(abc\)。
\(ac+bc=ab\)
\(ab-ac-bc+c^2=c^2\)
\((a-c)(b-c)=c^2\)
设\(a-c=x\),\(b-c=y\),则\(xy=c^2\)
若\(a,b,c\)不互质,则存在\(g,(g>1)\)满足\(g|(x+c)\)且\(g|(y+c)\)且\(g|c\)。
那么\(g|x\)且\(g|y\)且\(g|c\)。即满足\(x,y,c\)互质即可
若\(x,y,c\)不互质,则存在\(g,(g>1)\)满足\(x=gx'\)且\(y=gy'\)且\(g|c\)。
即\(x'y'g^2=c^2\),\(g^2 | c^2\),\(g|c\)。
就是说,只要满足\(g|x\)且\(g|y\),就能满足\(g|c\)。
所以,只要\(gcd(x,y)=1\)即可。
此外,还要满足\(max(x,y)+c\leq n\)。
不妨设\(y<x\),那么\(x+c\leq n\)。
因为\(gcd(x,y)=1\),所以\(c^2\)的每种质因子,要么都给x,要么都给y。
因此,\(x,y\)都是完全平方数。
设\(i^2=x\),\(j^2=y(j<i)\),那么\(c=ij\)。
因为\(i^2+ij\leq n\),所以\(i(i+j)\leq n\),即\(j\leq \frac{n}{i}-i\)。
设\(R_i=min(i-1,\frac{n}{i}-i)\),则答案为
\(\sum_{i=1}^n {\sum_{j=1}^{R_i} [gcd(i,j)=1]}\)
直接莫比乌斯反演:
\(\sum_{d=1}^n u(d){\sum_{d|i}^{} {\left \lfloor \frac{R_i}{d} \right \rfloor}}\)
当\(i>\sqrt{n}\)时,显然\(R_i=0\),忽略即可。
时间复杂度\(O(\sqrt{n}log\sqrt{n})\)。
最后别忘乘2。
代码:
#include <stdio.h>
#define ll long long
ll R[1000010];
int sa[1000010],ss[1000010],u[1000010],sl=0;
void getu(int n)
{
u[1]=1;
for(int i=2;i<=n;i++)
{
if(!sa[i])
{
ss[sl++]=i;
u[i]=-1;
}
for(int j=0;j<sl&&i*ss[j]<=n;j++)
{
sa[i*ss[j]]=true;
if(i%ss[j]==0)
{
u[i*ss[j]]=0;
break;
}
u[i*ss[j]]=-u[i];
}
}
}
int main()
{
ll n,ans=0;int m=0;
scanf("%lld",&n);
if(n==1)
{
printf("0");
return 0;
}
for(int i=2;i<=n;i++)
{
R[i]=n/i-i;
if(i-1<R[i])
R[i]=i-1;
if(R[i]<=0)
break;
m=i;
}
getu(m);
for(int i=1;i<=m;i++)
{
if(u[i])
{
for(int j=i;j<=m;j+=i)
ans+=u[i]*(R[j]/i);
}
}
printf("%lld",ans*2+1);
return 0;
}