题意:
给定\(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; }
来源:https://www.cnblogs.com/lnzwz/p/12128600.html