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;
}
posted @ 2020-01-01 12:06  lnzwz  阅读(231)  评论(0编辑  收藏  举报