zoukankan      html  css  js  c++  java
  • LJJ爱数数(莫比乌斯反演)

    题意:

    给定(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;
    }
    
  • 相关阅读:
    jvm基本结构和解析
    多态的意思
    java中对象的简单解读
    double类型和int类型的区别
    python 解析xml文件
    win10不能映射Ubuntu共享文件
    Qt程序打包
    Ubuntu boot分区文件误删,系统无法启动,怎么解
    ubuntu Boot空间不够问题“The volume boot has only 5.1MB disk space remaining”
    Ubuntu 分辨率更改 xrandr Failed to get size of gamma for output default
  • 原文地址:https://www.cnblogs.com/lnzwz/p/12128600.html
Copyright © 2011-2022 走看看