[luogu3455]ZAP-Queries
有时候我们会遇到一类问题:求$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的更多相关文章
- 【Luogu3455】【POI2007】ZAP-Queries(莫比乌斯反演)
[Luogu3455][POI2007]ZAP-Queries(莫比乌斯反演) 题面 题目描述 FGD正在破解一段密码,他需要回答很多类似的问题:对于给定的整数a,b和d,有多少正整数对x,y,满足x ...
- 实践 HTML5 的 CSS3 Media Queries
先来介绍下 media,确切的说应该是 CSS media queries(CSS 媒体查询),媒体查询包含了一个媒体类型和至少一个使用如宽度.高度和颜色等媒体属性来限制样式表范围的表达式.CSS3 ...
- SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问
delphi ado 跨数据库访问 语句如下 ' and db = '帐套1' 报错内容是:SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATE ...
- CSS3 Media Queries 实现响应式设计
在 CSS2 中,你可以为不同的媒介设备(如屏幕.打印机)指定专用的样式表,而现在借助 CSS3 的 Media Queries 特性,可以更为有效的实现这个功能.你可以为媒介类型添加某些条件,检测设 ...
- 使用CSS3 Media Queries实现网页自适应
原文来源:http://webdesignerwall.com 翻译:http://xinyo.org 当今银屏分辨率从 320px (iPhone)到 2560px (大屏显示器)或者更大.人们也不 ...
- SQL Queries from Transactional Plugin Pipeline
Sometimes the LINQ, Query Expressions or Fetch just doesn't give you the ability to quickly query yo ...
- Media Queries 详解
Media Queries直译过来就是“媒体查询”,在我们平时的Web页面中head部分常看到这样的一段代码: <link href="css/reset.css" rel ...
- 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 ...
- 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 ...
- 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组
F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...
随机推荐
- [spoj DISUBSTR]后缀数组统计不同子串个数
题目链接:https://vjudge.net/contest/70655#problem/C 后缀数组的又一神奇应用.不同子串的个数,实际上就是所有后缀的不同前缀的个数. 考虑所有的后缀按照rank ...
- 原生toolbar基本使用教程
1.先写布局文件 <android.support.v7.widget.Toolbar android:id="@+id/toolbar" app:title=" ...
- Idea 怎么远程debug
注意的问题:远程debug别人的服务器只能开一个debug,所以当你的同事比你先远程debug同一台服务器时,你应该报Error running 某某ip地址 .unable to open debu ...
- bzoj 5093 [Lydsy1711月赛]图的价值 NTT+第二类斯特林数
[Lydsy1711月赛]图的价值 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 245 Solved: 128[Submit][Status][D ...
- Sync Data to AWS S3 on Windows Box
1. Install AWS CLI first, windows download link https://s3.amazonaws.com/aws-cli/AWSCLI64.msi 2. The ...
- windows下maven打包eclipse工程
打包过程中,可能出现的2个问题: ①.[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build ...
- Git菜鸟
1.git 和svn的差异 git和svn 最大的差异在于git是分布式的管理方式而svn是集中式的管理方式.如果不习惯用代码管理工具,可能比较难理解分布式管理和集中式管理的概念.下面介绍两种工具的工 ...
- 转 appium解决每次运行都需要安装Unlock以及AppiumSetting的问题
一.需要解决的问题 在部分android机型上每次运行最新版的appium-desktop都需要安装AppiumSetting以及Unlock,并且安装过程需要用户手动来确认,即使测试机上已经安装了这 ...
- 原型 Boolean String Math Date知识点
原型 1.定义 每一个对象都有原型 原型仍然是一个对象 模拟实现面向对象的继承性 2.原型链 对象的原型还有原型 对象除了可以使用自有属性还可以继承原型上的属性 3.获取原型 对象.__proto__ ...
- 多个springboot项目部署在同一tomcat上,出现jmx错误
多个springboot项目部署在同一tomcat上,出现jmx错误 原因:因为jmx某些东西重复,禁用jmx就可以了 endpoints.jmx.unique-names=true