【数论】[SDOI2015]约数个数和

传送门:
https://www.luogu.com.cn/problem/P3327
https://www.acwing.com/problem/content/1360/

莫比乌斯反演 + 整除分块

分析

首先,我们给出一个结论:

d(ij)=x|iy|j[(x,y)=1]

证明:

i 的分解式为 i=pkαk ,类似地,j=pkβk

对于质数 pkij 对应的因数个数为 αk+βk+1

而对于右式,pk 如果想要产生贡献,那么只可能是:x,y 不同时存在因数 pk,注意到对应的贡献数即为 αk+βk+1

因此,由乘法原理,所求证式成立。

为了防止混淆,我们将题面中的 n,m 记为 N,M

由上述结论,题目的式子转化为:

i=1Nj=1Mx|iy|j[(x,y)=1]

莫比乌斯反演:若 F(n)=n|df(d),则有 f(n)=n|dμ(dn)F(d)

于是我们设 f(n)=i=1Nj=1Mx|iy|j[(x,y)=n] ,对应的 F(n)=i=1Nj=1Mx|iy|j[n|(x,y)]

下面对 F(n) 进行变换:

F(n)=i=1Nj=1Mx|iy|j[n|(x,y)]=x=1Ny=1MNxMy[n|(x,y)]

x=xn ,y=yn ,N=Nn ,M=Mn ,进而有

F(n)=x=1Ny=1MNxMy=x=1NNxy=1MMy

h(x)=i=1xxih(x) 可用整除分块处理。

由莫比乌斯反演,f(n)=n|dμ(dn)F(d) ,我们只需求 f(1)

下面对 f(1) 进行变换:

f(1)=dμ(d)F(d)=dμ(d)h(Nd)h(Md)

由整除分块知,h(Nd)h(Md) 取值最多为 N+M 块,而对于每一块,可以用前缀和 O(1) 处理出对应的 μ 值,因此整体的复杂度为 O(T(N+M))

细节见代码:

#include<bits/stdc++.h>
using namespace std;

const int S=50050;

int primes[S], cnt;
bool vis[S];
int mu[S], sum[S];
int h[S];

int g(int b, int l){
	return b/(b/l);
}

void init(){
	// init sum[]
	mu[1]=1;
	for(int i=2; i<S; i++){
		if(!vis[i]) primes[cnt++]=i, mu[i]=-1;
		for(int j=0; i*primes[j]<S; j++){
			vis[i*primes[j]]=true;
			if(i%primes[j]==0) break;
			mu[i*primes[j]]=-mu[i];
		}
	}
	for(int i=1; i<S; i++) sum[i]=sum[i-1]+mu[i];
	
	// init h[]
	for(int x=1; x<S; x++){
		int &v=h[x];
		for(int l=1, r; l<=x; l=r+1){
			r=min(x, g(x, l));
			v+=x/l*(r-l+1);
		}
	}
}

int solve(int N, int M){
	int res=0;
	
	int n=min(N, M);
	for(int l=1, r; l<=n; l=r+1){
		r=min(n, min(g(N, l), g(M, l)));
		res+=(sum[r]-sum[l-1])*h[N/l]*h[M/l];
	}
	return res;
}

int main(){
	int T; cin>>T;
	init();
	while(T--){
		int N, M; cin>>N>>M;
		cout<<solve(N, M)<<endl;
	}
	return 0;
}
posted @   HinanawiTenshi  阅读(73)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示