首页 > 其他分享 >莫比乌斯反演

莫比乌斯反演

时间:2024-07-30 09:06:51浏览次数:9  
标签:lfloor frac 乌斯 sum rfloor 反演 long 莫比 define

数列分块

常与数列分块连用
向下取整括号一定要加对

		int End=0,N=a/d,M=b/d;
		if(N<M) swap(N,M);
		for(int Start=1;Start<=M;Start=End+1)
		{
			End=min(N/(N/Start),M/(M/Start));//注意边界
			ans+=(sum[End]-sum[Start-1])*(long long)(N/Start)*(M/Start);//注意括号
		}	

常见公式

\[\sum_{d|n}\mu(d)=[n=1] \]

\[\sum_{d|n}\phi (d)=n \]

\[若f(n)=\sum_{d|n}g(d),则有g(n)=\sum_{d|n}\mu(d)f(\frac{n}{d}) \]

例题

P3455 [POI2007] ZAP-Queries

最基础的一题
假设\(a<=b\)

\[\large \sum_{i=1}^a\sum_{j=1}^b[gcd(i,j)=d] \]

\[\large \sum_{i=1}^{\lfloor {\frac{a}{d}} \rfloor}\sum_{j=1}^{\lfloor {\frac{b}{d}} \rfloor}[gcd(i,j)=1] \]

\[\large \sum_{i=1}^{\lfloor {\frac{a}{d}} \rfloor}\sum_{j=1}^{\lfloor {\frac{b}{d}} \rfloor}\sum_{t|gcd(i,j)}\mu(t) \]

\[\large \sum_{t=1}^n\mu(t)\lfloor {\frac{a}{dt}} \rfloor \lfloor {\frac{b}{dt}} \rfloor \]

单次询问\(O(\sqrt n)\)

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define ull unsigned long long
#define lid (rt<<1)
#define rid (rt<<1|1)
// #define endl '\n'
//#define int long long
#define pb push_back
// #pragma comment(linker, “/STACK:512000000,512000000”) 
using namespace std;
const int N = 1e6+5;
ll mu[N],n,tot,pr[N],m,sum[N];bool is[N];
ll a,b,d;
void getMu(int n)
{
	mu[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!is[i])
		{
			pr[++tot]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=tot&&i*pr[j]<=n;j++)
		{
			is[i*pr[j]]=1;
			if(i%pr[j]==0)
			{
				mu[i*pr[j]]=0;
				break;
			}
			mu[i*pr[j]]=-mu[i];
		}
	}
	for(int i=1;i<=n;i++)
	{
		// cout<<mu[i]<<" ";
		sum[i]=sum[i-1]+mu[i];
	}
}
int main()
{
	speed();
	// freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
	int T;
	cin>>T;
	getMu(5e4);
	while(T--)
	{
		cin>>a>>b>>d;
		ll ans=0;
		if(a>b)swap(a,b);
		// int End=0,N=a/d,M=b/d;
		// if(N<M) swap(N,M);
		// for(int Start=1;Start<=M;Start=End+1)
		// {
		// 	End=min(N/(N/Start),M/(M/Start));
		// 	ans+=(sum[End]-sum[Start-1])*(long long)(N/Start)*(M/Start);
		// }		
		int l=1,r;a/=d;b/=d;
		while(l<=a)
		{
			r=min(a/(a/l),b/(b/l));
			ans+=1ll*(sum[r]-sum[l-1])*(long long)(a/l)*(b/l);
			l=r+1;
		}
		cout<<ans<<endl;
	}
	return 0;
}

P2257 YY的GCD

同理

\[\large \sum_{k=1}^n\sum_{t=1}^{\lfloor { \frac{n}{k}}\rfloor}\mu(t)\lfloor {\frac{n}{kt}} \rfloor \lfloor {\frac{m}{kt}} \rfloor (k\in prime) \]

这样还没完,会超时,我们设\(T=kt\),则

\[\large \sum_{T=1}^n\lfloor {\frac{n}{T}} \rfloor\lfloor {\frac{m}{T}} \rfloor \times \sum_{k|T}\mu(\frac{T}{k}) (k\in prime) \]

我们发现这东西是可以预处理出来的(类似狄利克雷前缀和)

点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define ull unsigned long long
#define lid (rt<<1)
#define rid (rt<<1|1)
// #define endl '\n'
//#define int long long
#define pb push_back
// #pragma comment(linker, “/STACK:512000000,512000000”) 
using namespace std;
const int N = 1e7+5;
int mu[N],n,tot,pr[N],m,f[N],sum[N];bool is[N];
void getMu(int n)
{
	mu[1]=1;
	for(int i=2;i<=n;i++)
	{
		if(!is[i])
		{
			pr[++tot]=i;
			mu[i]=-1;
		}
		for(int j=1;j<=tot&&i*pr[j]<=n;j++)
		{
			is[i*pr[j]]=1;
			if(i%pr[j]==0)
			{
				mu[i*pr[j]]=0;
				break;
			}
			mu[i*pr[j]]=-mu[i];
		}
	}
	for(int i=1;i<=tot;i++)
	{
		for(int j=1;pr[i]*j<=n;j++)
		{
			f[pr[i]*j]+=mu[j];
		}
	}
	for(int i=1;i<=n;i++)
	{
		sum[i]=sum[i-1]+f[i];
	}
}

int main()
{
	speed();
	// freopen("in.in","r",stdin);
	// freopen("out.out","w",stdout);
	int T;
	cin>>T;
	getMu(1e7);
	// for(int i=1;i<=10;i++)cout<<mu[i]<<" ";
	// cout<<endl;
	while(T--)
	{
		cin>>n>>m;
		if(n>m)swap(n,m);
		ll ans=0;
		int l=1,r;
		while(l<=n)
		{
			r=min(n/(n/l),m/(m/l));
			ans+=1ll*(sum[r]-sum[l-1])*(long long)(n/l)*(m/l);
			l=r+1;
		}
		cout<<ans<<endl;
	}
	return 0;
}

标签:lfloor,frac,乌斯,sum,rfloor,反演,long,莫比,define
From: https://www.cnblogs.com/wlesq/p/18329269

相关文章

  • 莫比乌斯反演
    莫比乌斯反演前置芝士:数论分块求\(\sum\limits_{i=1}^n\lfloor\frac{n}{i}\rfloor\),其中\(n\le10^{12}\)。可以发现,\(\lfloor\frac{n}{i}\rfloor\)最多只有\(\sqrt{n}\)种取值,所以只需要枚举每种取值对应\(i\)的取值范围即可。llans=0;for(inti=1,j;i<=n;i=......
  • ABC361F x=a^b(容斥,莫比乌斯反演)
    题意求\(1\)~\(n\)中有多少数\(x\)可以写成\(x=a^b\)的形式(其中\(b\ge2\))\(n\le10^{18}\)容斥显然\(1\)是可以写成\(1^b\)的,我们单独讨论这种情况,以下默认\(a\ge2\)发现一个数有可能有很多种\(a^b\)的写法,比如\(64=2^6=4^3=8^2\)显然当\(b\)不是质数......
  • 空间反演对称性 (Spatial Inversion Symmetry) 和非线性响应 (Non-linear Response)
    我们定义一次宇称变换(paritytransformation)为反转所有坐标:\[\mathcal{P}:\begin{pmatrix}x\\y\\z\end{pmatrix}\rightarrow\begin{pmatrix}-x\\-y\\-z\end{pmatrix}\]如果在一维世界中,宇称变换就像是透过“镜子”看这个世界;在三维世界中,则是将全部体系对于......
  • 容易的多元拉格朗日反演练习题
    你说得对,但确实和题目没有一点关系。模拟赛记录下午出。题面看到Alice和Bob就知道是什么题了。思路这个题开始先胡乱想想,发现按照博弈论的思路,那么每次Bob行动一步后,Alice需要有对应的策略,也就是说,若Alice必胜,这次行动应该是固定的最优策略步。然后再代入一下,如果......
  • 莫比乌斯函数与莫比乌斯反演
    9.莫比乌斯函数与莫比乌斯反演9.1莫比乌斯函数9.1.1定义设\(\mu\)为莫比乌斯函数,则有:\[\mu(x)=\begin{cases}1\qquad(n=1)\\0\qquad(∃\i\(ki=x,k\inZ\rightarrow\sqrt{i}\inZ))\\(-1)^{\sum_{i\inprime}[i\midx]}\end{cases}\]直观地说,只要\(x\)的某个质......
  • Solution Set - 容斥原理/二项式反演
    https://www.becoder.com.cn/contest/5400「BZOJ2863」愤怒的元首题目就是求\(n\)个点DAG的数量。设\(dp_i\)表示\(i\)个点的DAG数量。首先DAG一定存在出度为\(0\)的点,其次删去出度为\(0\)的点,仍构成一个DAG。所以我们可以枚举删去的数量,从而划分子问题。......
  • 基于Python星载气溶胶数据处理与反演分析
    在当前全球气候变化和环境污染问题日益突出的背景下,气溶胶研究显得尤为重要。气溶胶在大气中由直径范围在0.01微米至10微米固体和液体颗粒构成,直接或间接影响地球辐射平衡、气候变化和空气质量。尤其在“碳中和”目标的驱动下,研究气溶胶对“碳中和”的气候影响及其环境效应,不仅......
  • 【笔记】Set - 容斥原理/二项式反演
    https://www.becoder.com.cn/contest/5400「BZOJ2863」愤怒的元首题目就是求\(n\)个点DAG的数量。设\(dp_i\)表示\(i\)个点的DAG数量。首先DAG一定存在出度为\(0\)的点,其次删去出度为\(0\)的点,仍构成一个DAG。所以我们可以枚举删去的数量,从而划分子问题。......
  • 基于MATLAB的从图像反演SAR原始回波【持续更新】
    一、概论当前在网上公开的SAR数据大部分都是聚焦过后的SLC图像,对想研究成像原理的朋友十分不友好,该文章提出了一种基于图像进行反演SAR原始回波的方法。二、SAR原理介绍想要理解SAR的原理,需要先了解两个基本概念1、多普勒效应多普勒效应(Dopplereffect)是为纪念奥地......
  • 莫比乌斯反演
    前置知识:积性函数。定义:一个函数\(f\),若\(\forall\gcd(a,b)=1\),都有\(f(a)\timesf(b)=f(a\timesb)\),则它是积性函数。一个函数\(f\),若\(\forall(a,b)\),都有\(f(a)\timesf(b)=f(a\timesb)\),则它是完全积性函数。正题狄利克雷卷积先放一张图方便下文理解(copyz......