题目描述

f(n)=(lcm(x,y)==n(x&lt;=y))f(n)=\\left(lcm(x,y)==n的二元组(x&lt;=y)的数量\\right)f(n)=(lcm(x,y)==n(x<=y))
i=abf(i)\\sum_{i=a}^bf(i)i=abf(i)
1ab10111\\le a\\le b\\le10^{11}1ab1011

题目分析

实质上就是求ijlcm(i,j)n\\sum_i\\sum_jlcm(i,j)\\le nijlcm(i,j)n的数量,最后加上n,再除以2
看到这种条件里面带不等式的,求和符号能省去范围的就省掉,不然会很冗杂
枚举gcd:
=d=1nij[(i,j)==1][ijd&lt;=n]=\\sum_{d=1}^n\\sum_i\\sum_j[(i,j)==1][ijd&lt;=n]=d=1nij[(i,j)==1][ijd<=n]
反演,去掉[(i,j)==1]:
=k=1nμ(k)dij[ijd&lt;=nk2]=\\sum_{k=1}^{\\sqrt n}\\mu(k)\\sum_d\\sum_i\\sum_j\\left[ijd&lt;=\\lfloor\\frac n{k^2}\\rfloor\\right]=k=1nμ(k)dij[ijd<=k2n]
那么现在就是求g(n)=abc[abc&lt;=n]g(n)=\\sum_a\\sum_b\\sum_c[abc&lt;=n]g(n)=abc[abc<=n]

假设a&lt;=b&lt;=ca&lt;=b&lt;=ca<=b<=c,那么只需要枚举不超过n13\\large n^{\\frac 13}n31aaa,再枚举不超过na\\large\\sqrt{\\frac na}anbbb,统计c的个数,在配上对应的容斥系数,考虑一下两个数,三个数相等的情况即可。
g(n)g(n)g(n)的时间复杂度为i=1n13(nii)\\sum_{i=1}^{n^{\\frac 13}}(\\sqrt{\\frac ni}-i)i=1n31(ini)O(n23)O(n^{\\frac 23})O(n32)

  • PS:
    枚举lcmlcmlcm,原式=i=1nxiyi[(x,y)==1]=i=1nσ0(i2)=\\sum_{i=1}^n\\sum_{x|i}\\sum_{y|i}[(x,y)==1]\\\\=\\sum_{i=1}^n\\sigma_0(i^2)=i=1nxiyi[(x,y)==1]=i=1nσ0(i2)
    问题等同于Counting Divisors
#include<cstdio>
#define LL long long
const int N = 10000005;
int p[N/10],mu[N+5];
bool v[N+5];
void Prime()
{
	mu[1]=1;int cnt=0;
	for(int i=2;i<=N;i++)
	{
		if(!v[i]) p[++cnt]=i,mu[i]=-1;
		for(int j=1,k;j<=cnt&&p[j]*i<=N;j++)
		{
			v[k=p[j]*i]=1;
			if(i%p[j]==0) {mu[k]=0;break;}
			mu[k]=-mu[i];
		}
	}
}
LL solve(LL n)
{
	LL ans=0;
	for(LL k=1;k*k<=n;k++) if(mu[k])
	{
		LL m = n/(k*k), ret=0;
		for(LL i=1;i*i*i<=m;i++)
		{
			for(LL j=i+1;i*j*j<=m;j++) ret+=(m/(i*j)-j)*6+3;
			ret+=(m/(i*i)-i)*3+1;
		}
		ans+=mu[k]*ret;
	}
	return (ans+n)/2;
}
int main()
{
	Prime();
	LL a,b;
	scanf(\"%lld%lld\",&a,&b);
	printf(\"%lld\",solve(b)-solve(a-1));
}
收藏 打印