【题解】Luogu P2257 YY的GCD

P2257

T T T 组数据。

给定 N , M N,M N,M ,求 1 ≤ x ≤ N , 1 ≤ y ≤ M 1\le x \le N,1\le y \le M 1xN,1yM , gcd ( x , y ) \text{gcd}(x,y) gcd(x,y) 为质数的对数。

T ≤ 1 0 4   ,   N , M ≤ 1 0 7 T\le 10^4\ , \ N,M\le 10^7 T104 , N,M107


Solution

根据题意,其实是求(假设 n < m n<m n<m ):
∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) ∈ P r i m e ] \sum_{i=1}^n\sum_{j=1}^{m}[\text{gcd}(i,j)\in Prime] i=1nj=1m[gcd(i,j)Prime]
化简式子,先枚举质数:
∑ p ∈ P r i m e ∑ i = 1 n ∑ j = 1 m [ gcd ( i , j ) = = p ] \sum_{p\in Prime}\sum_{i=1}^{n}\sum_{j=1}^{m}[\text{gcd}(i,j)==p] pPrimei=1nj=1m[gcd(i,j)==p]
同时除以 p p p
∑ p ∈ P r i m e ∑ i = 1 ⌊ n p ⌋ ∑ j = 1 ⌊ m p ⌋ [ gcd ( i , j ) = = 1 ] \sum_{p\in Prime}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}[\text{gcd}(i,j)==1] pPrimei=1pnj=1pm[gcd(i,j)==1]
我们知道 ϵ ( x ) = { 1      x = 1 0     otherwise \epsilon (x)=\begin{cases}1\ \ \ \ x=1\\0\ \ \ \ \text{otherwise}\end{cases} ϵ(x)={1    x=10    otherwise

ϵ = μ   ∗   1 = ∑ d ∣ n μ ( d ) \epsilon = \mu \ *\ 1=\large\sum\limits_{d|n}\normalsize\mu(d) ϵ=μ  1=dnμ(d)

∑ p ∈ P r i m e ∑ i = 1 ⌊ n p ⌋ ∑ j = 1 ⌊ m p ⌋ ∑ d ∣ gcd ( i , j ) μ ( d ) \sum_{p\in Prime}\sum_{i=1}^{\lfloor\frac{n}{p}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{p}\rfloor}\sum_{d|\text{gcd}(i,j)}\mu(d) pPrimei=1pnj=1pmdgcd(i,j)μ(d)

先枚举 d d d
∑ p ∈ P r i m e ∑ d = 1 ⌊ n p ⌋ μ ( d ) ⋅ ⌊ n p d ⌋ ⋅ ⌊ m p d ⌋ \sum_{p\in Prime}\sum_{d=1}^{\lfloor\frac{n}{p}\rfloor}\mu(d)\cdot\lfloor\cfrac{n}{pd}\rfloor\cdot\lfloor\cfrac{m}{pd}\rfloor pPrimed=1pnμ(d)pdnpdm

优化时间复杂度的一个常规操作,令 k = p d k=pd k=pd,枚举 k k k
∑ k = 1 n ∑ p ∈ P r i m e , p ∣ n μ ( k p ) ⋅ ⌊ n k ⌋ ⋅ ⌊ m k ⌋ \sum_{k=1}^{n}\sum_{p\in Prime,p\mid n}\mu(\cfrac{k}{p})\cdot\lfloor\cfrac{n}{k}\rfloor\cdot\lfloor\cfrac{m}{k}\rfloor k=1npPrime,pnμ(pk)knkm

f ( n ) = ∑ p ∈ P r i m e , p ∣ n μ ( n p ) f(n)=\large\sum\limits_{p\in Prime,p\mid n}\normalsize\mu(\cfrac{n}{p}) f(n)=pPrime,pnμ(pn),考虑预处理

n ∈ P r i m e n\in Prime nPrime ,则 f ( n ) = − 1 f(n)=-1 f(n)=1

否则,若 n n n 最小的质因子是 r r r ,则

r 2 ∣ n r^2\mid n r2n ,当 n r \cfrac{n}{r} rn 没有平方因子时, f ( n ) = μ ( n r ) f(n)=\mu(\cfrac{n}{r}) f(n)=μ(rn) , 否则 f ( n ) = 0 = μ ( n r ) f(n)=0=\mu(\cfrac{n}{r}) f(n)=0=μ(rn)

r 2 ∤ p r^2 \nmid p r2p f ( n ) = ∑ p ∈ P r i m e , p ∣ n μ ( n p ) = μ ( n r ) + ∑ p ∈ P r i m e , p ∣ n r μ ( n p r ) μ ( r ) f(n)=\large\sum\limits_{p\in Prime,p\mid n}\normalsize\mu(\cfrac{n}{p})=\mu(\cfrac{n}{r})+\large\sum\limits_{p\in Prime,p\mid \frac{n}{r}}\normalsize\mu(\cfrac{n}{pr})\mu(r) f(n)=pPrime,pnμ(pn)=μ(rn)+pPrime,prnμ(prn)μ(r)

f ( n ) = μ ( n r ) − ∑ p ∈ P r i m e μ ( n p r ) = μ ( n r ) − f ( n r ) f(n)=\mu(\cfrac{n}{r})-\large\sum\limits_{p\in Prime}\normalsize\mu(\cfrac{n}{pr})=\mu(\cfrac{n}{r})-f(\cfrac{n}{r}) f(n)=μ(rn)pPrimeμ(prn)=μ(rn)f(rn)

在欧拉筛的时候递推计算即可。

其余部分整除分块,时间复杂度 O ( N + N ) O(N+\sqrt N) O(N+N )


AC Code

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define int long long
using namespace std;

const int SIZE=1e4+5,N=1e7+5;

int T;
int a[SIZE],b[SIZE];
int prime[N],miu[N],v[N],f[N];
int n;

void euler()
{
	int m=0;miu[1]=1;
	for(register int i=2;i<=n;i++)
	{
		if(!v[i]) v[i]=i,miu[i]=-1,f[i]=1,prime[++m]=i;
		for(register int j=1;j<=m;j++)
		{
			if(prime[j]>v[i]||prime[j]*i>n) break;
			v[i*prime[j]]=prime[j];
			miu[i*prime[j]]=(i%prime[j]?-miu[i]:0);
			f[i*prime[j]]=(i%prime[j]?miu[i]-f[i]:miu[i]);
		}
	}
}

signed main()
{
	scanf("%lld",&T);
	for(register int i=1;i<=T;i++)
	{
		scanf("%lld%lld",&a[i],&b[i]);
		if(a[i]>b[i]) swap(a[i],b[i]);
		n=max(n,a[i]);
	}
	euler();    //数据范围较大,离线处理
	for(register int i=2;i<=n;i++) f[i]+=f[i-1];   //前缀和优化
	for(register int i=1;i<=T;i++)
	{
		int ans=0,n=a[i],m=b[i];
		for(register int l=1,r=0;l<=n;l=r+1)    //整除分块
		{
			r=min(n/(n/l),m/(m/l));
			ans+=(f[r]-f[l-1])*(n/l)*(m/l);
		}
		printf("%lld\n",ans);
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值