洛谷P2522 (莫比乌斯反演)

在这里插入图片描述

和P3455tm神似,加了一个容斥原理统计答案
ans=sqr(b,d,k)-sqr(b,c-1)-sqr(a-1,d)+sqr(a-1,c-1);
其他应该没啥需要注意的了吧,证明见P3455那篇博客
代码

#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 50007;
const int maxm = 50000;

ll sum[maxn],tot,prime[maxn],u[maxn];
int vis[maxn];

void fir()
{
	u[1]=1;
	for(int i=2;i<=maxm;i++)
	{
		if(!vis[i])
		{
			prime[++tot]=i;
			u[i]=-1;
		}
		for(int j=1;j<=tot&&i*prime[j]<=maxm;j++)
		{
			vis[prime[j]*i]=1;
			if(i%prime[j]==0)break;
			u[prime[j]*i]=-u[i];
			
		}
	}
	for(int i=1;i<=maxm;i++)sum[i]=sum[i-1]+u[i];
}

ll sqr(ll a,ll b,ll d)
{
	ll ans=0;
	a/=d,b/=d;
	for(ll l=1,r;l<=min(a,b);l=r+1)
	{
		r=min(a/(a/l),b/(b/l));
		ans+=(sum[r]-sum[l-1])*(a/l)*(b/l);
	}
	return ans;
}


int main()
{
	int T;
	scanf("%d",&T);	
	fir();
	while(T--)
	{
		ll x,y,z,l,d;
		scanf("%lld%lld%lld%lld%lld",&x,&y,&z,&l,&d);
		printf("%lld\n",sqr(y,l,d)-sqr(y,z-1,d)-sqr(x-1,l,d)+sqr(x-1,z-1,d));
	}
}

你可能感兴趣的:(数论)