LJJ爱数数(莫比乌斯反演)

元气小坏坏 提交于 2020-01-01 12:29:29

题意:

给定\(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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!