版权声明:本文为博主原创文章,未经博主允许必须转载。 https://blog.csdn.net/C20181220_xiang_m_y/article/details/85037691
题目描述
求
题目分析
实质上就是求
的数量,最后加上n,再除以2
看到这种条件里面带不等式的,求和符号能省去范围的就省掉,不然会很冗杂
枚举gcd:
反演,去掉[(i,j)==1]:
那么现在就是求
假设
,那么只需要枚举不超过
的
,再枚举不超过
的
,统计c的个数,在配上对应的容斥系数,考虑一下两个数,三个数相等的情况即可。
求
的时间复杂度为
,
- PS:
枚举 ,原式
问题等同于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));
}