题意:
给定(n),求满足(frac{1}{a}+frac{1}{b}=frac{1}{c}),且(a,b,c)互质的三元组((a,b,c))数目。((a,b,cleq n))
(nleq10^{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)+cleq n)。
不妨设(y<x),那么(x+cleq n)。
因为(gcd(x,y)=1),所以(c^2)的每种质因子,要么都给x,要么都给y。
因此,(x,y)都是完全平方数。
设(i^2=x),(j^2=y(j<i)),那么(c=ij)。
因为(i^2+ijleq n),所以(i(i+j)leq n),即(jleq 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}
ight
floor}})
当(i>sqrt{n})时,显然(R_i=0),忽略即可。
时间复杂度(O(sqrt{n}logsqrt{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;
}