有时候我们会遇到一类问题:求$f(n)$,当然它是不好直接计算的,但如果$F(n)=\sum\limits_{d|n}f(d)$或$F(n)=\sum\limits_{\substack{n|d\\d\leq m}}f(d)$更易于计算,我们可以用莫比乌斯反演推导出$f(n)$关于$F(n)$的表达式并求值

先定义莫比乌斯函数,若$n=\prod\limits_{i=1}^kp_i^{e_i}$,则莫比乌斯函数$\mu(n)=\begin{cases}1&n=1\\0&\exists e_i\geq2\\\left(-1\right)^k&\forall e_i=1\end{cases}$

从定义可以看出,如果一个整数$n(n\geq2)$含平方因子,那么$\mu(n)=0$,反之,如果它由互异质数相乘而得,那么$质因子个数\mu(n)=(-1)^{\text{质因子个数}}$

莫比乌斯反演定理的一种形式可以描述为“若$F(n)=\sum\limits_{d|n}f(d)$,则$f(n)=\sum\limits_{d|n}\mu(d)F\left(\dfrac nd\right)$”,接下来我们慢慢证明

先证明一个关于莫比乌斯函数的定理:$\sum\limits_{d|n}\mu(d)=[n=1]$,证明如下

当$n=1$时,显然成立

当$n\gt1$,因为对和式有贡献的$d$只可能是从$p_{1\cdots k}$中选取一些不重复的数相乘,所以(选取$i$个数的乘积作为$d$)对和式的贡献是$\binom ki(-1)^i$,所以有如下推导

$$\begin{align*}\sum\limits_{d|n}\mu(d)&=\sum\limits_{i=0}^k\binom ki(-1)^i\\&=1+\sum\limits_{i=1}^k\left(\binom{k-1}{i-1}+\binom{k-1}i\right)(-1)^i\\&=1-\binom{k-1}0+\binom{k-1}k(-1)^k\\&=0\end{align*}$$

有了这个定理,我们就可以证明莫比乌斯反演定理了

$$\begin{align*}\sum\limits_{d|n}\mu(d)F(\dfrac nd)&=\sum\limits_{d|n}\mu(d)\sum\limits_{k|\frac nd}f(k)\\&=\sum\limits_{d|n}\sum\limits_{kd|n}\mu(d)f(k)\\&=\sum\limits_{k=1}^n\sum\limits_{\substack{d|n\\kd|n}}\mu(d)f(k)\\&=\sum\limits_{k=1}^nf(k)\sum\limits_{d|\frac nk}\mu(d)\\&=\sum\limits_{k=1}^nf(k)\left[\dfrac nk=1\right]\\&=f(n)\end{align*}$$

也就是如果$1$和$f$的狄利克雷卷积是$F$,那么$F$和$\mu$的狄利克雷卷积是$f$

这个定理有另一个形式$F(n)=\sum\limits_{n|d}f(d)\Rightarrow f(n)=\sum\limits_{n|d}\mu\left(\dfrac dn\right)F(d)$

因为是倍数和,这里约定$d\leq m$,它的证明是类似的

$$\begin{align*}\sum\limits_{n|d}\mu\left(\dfrac dn\right)F(d)&=\sum\limits_{n|d}\mu\left(\dfrac dn\right)\sum\limits_{d|k}f(k)\\&=\sum\limits_{k=1}^mf(k)\sum\limits_{\substack{n|d\\d|k}}\mu\left(\dfrac dn\right)\\&=\sum\limits_{k=1}^mf(k)\sum\limits_{\frac dn|\frac kn}\mu\left(\dfrac dn\right)\\&=f(n)\end{align*}$$

这个定理可以证明一条联系莫比乌斯函数和欧拉函数的式子,令$f(n)=\varphi(n)$,则$F(n)=n$,用反演定理的形式一可以得到$\varphi(n)=\sum\limits_{d|n}\mu(d)\dfrac nd$,整理得$\dfrac{\varphi(n)}n=\sum\limits_{d|n}\dfrac{\mu(d)}d$,挺优美的

实际做题的时候不一定要用上面的形式,也可以把$[n=1]$换成$\sum\limits_{d|n}\mu(d)$,看能否方便后续计算

下面是真正的应用了:用它来做题

这题要求$\sum\limits_{x=1}^a\sum\limits_{y=1}^b\left[\gcd(x,y)=k\right]$,转化一下就是$\sum\limits_{x=1}^{\left\lfloor\frac ak\right\rfloor}\sum\limits_{y=1}^{\left\lfloor\frac bk\right\rfloor}\left[\gcd(x,y)=1\right]$,于是我们令$f(n)=\sum\limits_{x=1}^{\left\lfloor\frac ak\right\rfloor}\sum\limits_{y=1}^{\left\lfloor\frac bk\right\rfloor}\left[\gcd(x,y)=n\right]$

考虑用反演定理的形式二,得到$F(n)=\sum\limits_{x=1}^{\left\lfloor\frac ak\right\rfloor}\sum\limits_{y=1}^{\left\lfloor\frac bk\right\rfloor}\left[n|\gcd(x,y)\right]=\left\lfloor\dfrac {\left\lfloor\frac ak\right\rfloor}n\right\rfloor\left\lfloor\dfrac{\left\lfloor\frac bk\right\rfloor}n\right\rfloor$,于是$f(n)=\sum\limits_{\substack{n|d\\d\leq\min\left\{\left\lfloor\frac ak\right\rfloor,\left\lfloor\frac bk\right\rfloor\right\}}}\mu\left(\dfrac dn\right)\left\lfloor\dfrac a{kd}\right\rfloor\left\lfloor\dfrac b{kd}\right\rfloor$

答案是$f(1)=\sum\limits_{d=1}^{\min\left\{\left\lfloor\frac ak\right\rfloor,\left\lfloor\frac bk\right\rfloor\right\}}\mu(d)\left\lfloor\dfrac a{kd}\right\rfloor\left\lfloor\dfrac b{kd}\right\rfloor$

学习了一种新的更简洁的写法,这种写法用一种特殊的技巧来快速枚举$d$使得每迭代一次$\left\lfloor\dfrac nd\right\rfloor$就改变一次

for(i=1;i<=n;i=nex+1){
	nex=n/(n/i);
	//计算[i,nex]的答案
}

循环内的第一行是最重要的,原理大概是这样

假设当$i\in[l,r]$时$\left\lfloor\dfrac ni\right\rfloor=k$且$\left\lfloor\dfrac n{r+1}\right\rfloor\lt k$,那么因为$\left\lfloor\dfrac nr\right\rfloor=k$所以$\left\lfloor\dfrac{\frac nk}r\right\rfloor=1$,所以$\dfrac nk\geq r$

如果$\dfrac nk\geq r+1$,那么$\dfrac n{r+1}\geq k$,这与$\left\lfloor\dfrac n{r+1}\right\rfloor\lt k$矛盾

所以$r\leq\dfrac nk\lt r+1$,即$\left\lfloor\dfrac nk\right\rfloor=r$

这样就解释清楚了为什么要这样写,整个题就做完了

#include<stdio.h>
#define ll long long
#define T 50000
int pr[50010],mu[50010];
bool np[50010];
void sieve(){
	int i,j,m;
	m=0;
	np[1]=1;
	mu[1]=1;
	for(i=2;i<=T;i++){
		if(!np[i]){
			m++;
			pr[m]=i;
			mu[i]=-1;
		}
		for(j=1;j<=m;j++){
			if(pr[j]*(ll)i>T)break;
			np[i*pr[j]]=1;
			if(i%pr[j]==0){
				mu[i*pr[j]]=0;
				break;
			}else
				mu[i*pr[j]]=-mu[i];
		}
	}
	for(i=2;i<=T;i++)mu[i]+=mu[i-1];
}
int a,b;
int min(int a,int b){return a<b?a:b;}
void swap(int&a,int&b){a^=b^=a^=b;}
int F(int n){return(a/n)*(b/n);}
int mob(){
	int i,s=0,nex;
	if(a>b)swap(a,b);
	for(i=1;i<=a;i=nex+1){
		nex=min(a/(a/i),b/(b/i));
		s+=F(i)*(mu[nex]-mu[i-1]);
	}
	return s;
}
int main(){
	sieve();
	int t,d;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d",&a,&b,&d);
		a/=d;
		b/=d;
		printf("%d\n",mob());
	}
}

感觉写太多字了,有点肝不动...

[luogu3455]ZAP-Queries的更多相关文章

  1. 【Luogu3455】【POI2007】ZAP-Queries(莫比乌斯反演)

    [Luogu3455][POI2007]ZAP-Queries(莫比乌斯反演) 题面 题目描述 FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x ...

  2. 实践 HTML5 的 CSS3 Media Queries

    先来介绍下 media,确切的说应该是 CSS media queries(CSS 媒体查询),媒体查询包含了一个媒体类型和至少一个使用如宽度.高度和颜色等媒体属性来限制样式表范围的表达式.CSS3 ...

  3. SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问

    delphi ado 跨数据库访问 语句如下 ' and db = '帐套1' 报错内容是:SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATE ...

  4. CSS3 Media Queries 实现响应式设计

    在 CSS2 中,你可以为不同的媒介设备(如屏幕.打印机)指定专用的样式表,而现在借助 CSS3 的 Media Queries 特性,可以更为有效的实现这个功能.你可以为媒介类型添加某些条件,检测设 ...

  5. 使用CSS3 Media Queries实现网页自适应

    原文来源:http://webdesignerwall.com 翻译:http://xinyo.org 当今银屏分辨率从 320px (iPhone)到 2560px (大屏显示器)或者更大.人们也不 ...

  6. SQL Queries from Transactional Plugin Pipeline

    Sometimes the LINQ, Query Expressions or Fetch just doesn't give you the ability to quickly query yo ...

  7. Media Queries 详解

    Media Queries直译过来就是“媒体查询”,在我们平时的Web页面中head部分常看到这样的一段代码:  <link href="css/reset.css" rel ...

  8. SPOJ GSS3 Can you answer these queries III[线段树]

    SPOJ - GSS3 Can you answer these queries III Description You are given a sequence A of N (N <= 50 ...

  9. SPOJ GSS1 Can you answer these queries I[线段树]

    Description You are given a sequence A[1], A[2], ..., A[N] . ( |A[i]| ≤ 15007 , 1 ≤ N ≤ 50000 ). A q ...

  10. 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组

    F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...

随机推荐

  1. chrome 不支持12px以下字体为题的解决

    现英文9px 设置 在chrome 下无效,可以通过 -webkit-transform: scale(0.75); 12*0.75 =9  得到小字体(在chrome浏览器下 大小缩放到0.75倍) ...

  2. 在linux环境下让java代码生效的步骤

    1.kill jboss 2.compile 3.deploy 4.bootstrap jboss.

  3. photo@PKU

  4. MySql数据库学习总结(MySQL入门到精通)

    2017.1.24-2.3日(在大兴实验室) 1.数据库存储引擎: (1)MyISAM: 访问速度快,对事物完整性没要求,并以访问为主的适合这个 (2)InnoDB: 更占磁盘空间,需要进行频繁的更新 ...

  5. phpcms v9 后台添加修改页面空白页问题解决方法

    phpcms v9 添加修改页面空白页的解决方法 找一个正常运行的phpcms 将caches\caches_model\caches_data 目录下的 content_form.class.php ...

  6. bzoj 1088 DP

    我们可以用w[i][s]来表示到第i位的方案,s代表第i位和第i+1位是否有雷的二进制串,那么我们就可以根据每一位的雷的数量转移了. /******************************** ...

  7. kernel 中 sscanf和sprintf()函数使用说明【转】

    转自:http://blog.csdn.net/tommy_wxie/article/details/8480695 在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望.由于s ...

  8. 定制一个支持中英文的简单LaTex模板

    平常写汇报文档什么的,word排版有时还是比较费劲,遂定制一个简单的LaTex模板,中文默认为宋体,英文为LaTex默认字体,支持彩色高亮展示,有目录书签,有页眉展示,大致如下: LaTex代码如下: ...

  9. ApplicationCommands 应用程序常见命令

    ApplicationCommands用于表示应用程序程序员经常遇到的常见命令,类似于ctrl+c 在WPF中,许多控件都自动集成了固有的命令集.比如文本框TextBox就提供了复制(Copy),粘贴 ...

  10. docker从零开始(三)服务初体验docker compose

    决条件 安装Docker 1.13或更高版本. 获取Docker Compose.在适用于Mac的Docker和适用于Windows的Docker上,它已预先安装,因此您可以随意使用.在Linux系统 ...