【BZOJ 2820】YY的GCD

【题目】

传送门

题目描述:

神犇 YY 虐完数论后给傻 × × × kAc 出了一题:

给定 n , m n, m n,m,求 1 ≤ x ≤ n 1≤x≤n 1xn 1 ≤ y ≤ m 1≤y≤m 1ym gcd ⁡ ( x , y ) \gcd(x, y) gcd(x,y) 为质数的 ( x , y ) (x, y) (x,y) 有多少对。

kAc 这种傻 × × ×必然不会了,于是向你来请教 … … ……

输入格式:

第一行一个整数 T T T,表示数据组数。

接下来 T T T 行,每行两个正整数,表示 n , m n, m n,m

输出格式:

T T T 行,每行一个整数表示第 i i i 组数据的结果

样例数据:

输入
2
10 10
100 100

输出
30
2791

提示:

对于 100 % 100\% 100% 的数据, T ≤ 10000 T ≤ 10000 T10000 n , m ≤ 10000000 n, m ≤ 10000000 n,m10000000


【分析】

题目要求的是这个东西:

∑ i = 1 n ∑ j = 1 m [    gcd ⁡ ( i , j )    i s    a    p r i m e    ] \sum_{i=1}^n\sum_{j=1}^m[\;\gcd(i,j)\;\mathrm {is\; a\; prime}\;] i=1nj=1m[gcd(i,j)isaprime]

如果用 P \mathbb{P} P 表示素数集的话,上式就是

∑ p ∈ P ∑ i = 1 n ∑ j = 1 m [    gcd ⁡ ( i , j ) = p    ] \sum_{p\in \mathbb{P}}\sum_{i=1}^n\sum_{j=1}^m[\;\gcd(i,j)=p\;] pPi=1nj=1m[gcd(i,j)=p]

我们定义

f ( x ) = ∑ i = 1 n ∑ j = 1 m [    gcd ⁡ ( i , j ) = x    ] f(x)=\sum_{i=1}^n\sum_{j=1}^m[\;\gcd(i,j)=x\;] f(x)=i=1nj=1m[gcd(i,j)=x]

F ( x ) = ∑ x ∣ d f ( d ) F(x)=\sum_{x|d}f(d) F(x)=xdf(d)

显然,我们可以得到

F ( x ) = ∑ i = 1 n ∑ j = 1 m [    x ∣ gcd ⁡ ( i , j )    ] = ⌊ n x ⌋ ⌊ m x ⌋ F(x)=\sum_{i=1}^n\sum_{j=1}^m[\;x|\gcd(i,j)\;]=\lfloor \frac n x\rfloor\lfloor \frac m x\rfloor F(x)=i=1nj=1m[xgcd(i,j)]=xnxm

用莫比乌斯反演得到

f ( x ) = ∑ x ∣ d μ ( d x ) F ( d ) f(x)=\sum_{x|d}\mu(\frac{d}{x})F(d) f(x)=xdμ(xd)F(d)

那么,最后的答案就是

∑ p ∈ P f ( p ) = ∑ p ∈ P ∑ p ∣ d μ ( d p ) ⌊ n d ⌋ ⌊ m d ⌋ \sum_{p\in\mathbb{P}}f(p)=\sum_{p\in\mathbb P}\sum_{p|d}\mu(\frac{d}{p})\lfloor \frac n d\rfloor\lfloor \frac m d\rfloor pPf(p)=pPpdμ(pd)dndm

我们把 d d d 改为枚举 p p p 的几倍,即

∑ p ∈ P ∑ d = 1 ⌊ m i n ( n , m ) p ⌋ μ ( d ) ⌊ n d ⋅ p ⌋ ⌊ m d ⋅ p ⌋ \sum_{p\in\mathbb P}\sum_{d=1}^{\lfloor\frac{min(n,m)}{p}\rfloor}\mu(d)\lfloor \frac n {d\cdot p}\rfloor\lfloor \frac m {d\cdot p}\rfloor pPd=1pmin(n,m)μ(d)dpndpm

D = d ⋅ p D=d\cdot p D=dp,交换一下枚举顺序,即

∑ D = 1 m i n ( n , m ) ∑ p ∣ D , p ∈ P μ ( D p ) ⌊ n D ⌋ ⌊ m D ⌋ \sum_{D=1}^{min(n,m)}\sum_{p|D,p\in\mathbb P}\mu(\frac{D}{p})\lfloor \frac n {D}\rfloor\lfloor \frac m {D}\rfloor D=1min(n,m)pD,pPμ(pD)DnDm

继续化简,得到

∑ D = 1 m i n ( n , m ) ⌊ n D ⌋ ⌊ m D ⌋ ( ∑ p ∣ D , p ∈ P μ ( D p ) ) \sum_{D=1}^{min(n,m)}\lfloor \frac n {D}\rfloor\lfloor \frac m {D}\rfloor(\sum_{p|D,p\in\mathbb P}\mu(\frac{D}{p})) D=1min(n,m)DnDm(pD,pPμ(pD))

g ( D ) = ∑ p ∣ D , p ∈ P μ ( D p ) g(D)=\sum\limits_{p|D,p\in\mathbb P}\mu(\frac{D}{p}) g(D)=pD,pPμ(pD)

那么,我们可以先线性筛出 μ \mu μ 的函数值,然后枚举每个质数以及每个质数的倍数把 g g g 暴力更新出来。

剩下的就可以整除分块做了。


【代码】

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10000005
#define ll long long
using namespace std;
bool mark[N];
int prime[N],mu[N],g[N];
void linear_sieves()
{
	int i,j,sum=0;
	memset(mark,true,sizeof(mark));
	mark[0]=mark[1]=false,mu[1]=1;
	for(i=2;i<N;++i)
	{
		if(mark[i])  prime[++sum]=i,mu[i]=-1;
		for(j=1;j<=sum&&i*prime[j]<N;++j)
		{
			mark[i*prime[j]]=false;
			if(i%prime[j])  mu[i*prime[j]]=-mu[i];
			else  {mu[i*prime[j]]=0;break;}
		}
	}
	for(i=1;i<=sum;++i)
	  for(j=1;j*prime[i]<N;++j)
	    g[j*prime[i]]+=mu[j];
	for(i=1;i<N;++i)  g[i]+=g[i-1];
}
ll solve(int n,int m)
{
	int i,j;ll ans=0;
	if(n>m)  swap(n,m);
	for(i=1;i<=n;i=j+1)
	{
		j=min(n/(n/i),m/(m/i));
		ans+=1ll*(g[j]-g[i-1])*(n/i)*(m/i);
	}
	return ans;
}
int main()
{
	int n,m,T;
	scanf("%d",&T);
	linear_sieves();
	while(T--)
	{
		scanf("%d%d",&n,&m);
		printf("%lld\n",solve(n,m));
	}
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
校园失物招领系统管理系统按照操作主体分为管理员和用户。管理员的功能包括字典管理、论坛管理、公告信息管理、失物招领管理、失物认领管理、寻物启示管理、寻物认领管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 校园失物招领系统管理系统可以提高校园失物招领系统信息管理问题的解决效率,优化校园失物招领系统信息处理流程,保证校园失物招领系统信息数据的安全,它是一个非常可靠,非常安全的应用程序。 ,管理员权限操作的功能包括管理公告,管理校园失物招领系统信息,包括失物招领管理,培训管理,寻物启事管理,薪资管理等,可以管理公告。 失物招领管理界面,管理员在失物招领管理界面中可以对界面中显示,可以对失物招领信息的失物招领状态进行查看,可以添加新的失物招领信息等。寻物启事管理界面,管理员在寻物启事管理界面中查看寻物启事种类信息,寻物启事描述信息,新增寻物启事信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值