[SDOI2014]数表

链接:https://www.luogu.com.cn/problem/P3312

题目描述:求i=1nj=1md(gcd(i,j))[d(gcd(i,j))<=a]

题解:我们先会有一个直观的想法:先不考虑a的限制:

i=1nj=1md(gcd(i,j))

=i=1nj=1md|gcd(i,j)d

=d=1nndmd

如果你这么推就推不下去了。

考虑换一种思路,将d看作一个不能拆开的函数:

i=1nj=1md(gcd(i,j))

=t=1ni=1nj=1m[gcd(i,j)==t]d(t)

=t=1ni=1ntj=1mt[gcd(i,j)==1]d(t)

=t=1nd(t)i=1ntj=1mts|gcd(i,j)μ(s)

=t=1nd(t)s=1nμ(s)ntsmts

=T=1nt|Td(t)μ(Tt)nTmT

我们可以将所有数按d(x)的值排序,将询问也按a排序,用树状数组处理贡献即可。

#include<iostream>
#include<algorithm> 
#define N 100000
using namespace std;
struct node
{
	long long x,y,a,num;
	bool operator < (const node &t)const
	{
		return a<t.a;
	}
};
struct reads
{
	long long num,data;
	bool operator < (const reads &a)const
	{
		return data<a.data;
	}
};
node query[1000001];
reads top[1000001];
long long c[1000001],res,f[1000001],miu[1000001],mod;
unsigned long long ans[1000001];
bool prime[1000001];
int lowbit(int x)
{
	return x&(-x);
}
void add(int x,int y)
{
	for (;x<=N;x+=lowbit(x))
		c[x]+=y;
	return;
}
long long sum(int x)
{
	res=0;
	for (;x>=1;x-=lowbit(x))
		res+=c[x];
	return res;
}
void prework()
{
	for (int i=1;i<=N;++i)
		miu[i]=1;
	for (int i=2;i<=N;++i)
		if (!prime[i])
			for (int j=i;j<=N;j+=i)
			{
				prime[j]=1;
				if ((j/i)%i==0)
					miu[j]=0;
				miu[j]=-miu[j];
			}
	for (int i=1;i<=N;++i)
		for (int j=i;j<=N;j+=i)
			f[j]+=i;
	for (int i=1;i<=N;++i)
	{
		top[i].num=i;
		top[i].data=f[i];
	}
	sort(top+1,top+N+1);
	return;
}
int main()
{
	prework();
	int t,pos=0,last;
	mod=(1ll<<31);
	cin>>t;
	for (int i=1;i<=t;++i)
	{
		cin>>query[i].x>>query[i].y>>query[i].a;
		query[i].num=i;
	}
	sort(query+1,query+t+1);
	for (int q=1;q<=t;++q)
	{
		while (pos<N&&top[pos+1].data<=query[q].a)
		{
			pos++;
			for (int i=top[pos].num;i<=N;i+=top[pos].num)
				add(i,top[pos].data*miu[i/top[pos].num]);
		}
		for (int i=1;i<=min(query[q].x,query[q].y);i=last+1)
		{
			last=min(query[q].x/(query[q].x/i),query[q].y/(query[q].y/i));
			ans[query[q].num]=(ans[query[q].num]+(query[q].x/i)*(query[q].y/i)%mod*(sum(last)-sum(i-1))%mod)%mod;
		}
	}
	for (int q=1;q<=t;++q)
		cout<<ans[q]<<endl; 
	return 0;
}
posted @   zhouhuanyi  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示
主题色彩