[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 ...
随机推荐
- bzoj3196 [TYVJ1730]二逼平衡树 树套树 线段树套替罪羊树
人傻自带大常数 二分的可行性证明: 贴近他的正确答案不会被当作次优解删掉,因为,若二分在他右边发生,那么二分一定会把左边作为优解,左边同理,所以他一定是被扣掉的所以最后一个小于等于一定是正确答案 #i ...
- 做一个所见即所得的CSS效果
style 也是标签(在非ie内核的浏览器中支持),我们将style设置成 contenteditable的时候,那么那的内容就可以编辑了.仔细的体验下,如果我们将背景修改成红色的.那么只要书写完,立 ...
- springMvc--请求的跳转和传值
springMvc--请求的跳转和传值 目录 forword跳转页面的三种方式 1.使用serlvet 2.使用Model对象 3.使用ModelAndView redirect跳转到页面 使用ser ...
- [poj 2104]主席树+静态区间第k大
题目链接:http://poj.org/problem?id=2104 主席树入门题目,主席树其实就是可持久化权值线段树,rt[i]维护了前i个数中第i大(小)的数出现次数的信息,通过查询两棵树的差即 ...
- java中枚举类到高级使用
参考博文: http://blog.csdn.net/qq_31655965/article/details/55049192 http://www.cnblogs.com/zhaoyanjun/p/ ...
- jquery 的相关 width 和 height 方法辨析
width() 设置或返回元素的宽度(不包括内边距.边框或外边距). height() 设置或返回元素的高度(不包括内边距.边框或外边距). innerWidth() 返回元素的宽度(包括内边距). ...
- 打砖块(codevs 1257)
题目描述 Description 在一个凹槽中放置了n层砖块,最上面的一层有n块砖,第二层有n-1块,……最下面一层仅有一块砖.第i层的砖块从左至右编号为1,2,……i,第i层的第j块砖有一个价值a[ ...
- c++对拍实现
直接上代码吧. #include<bits/stdc++.h> using namespace std; int main(){ while(1){ system("./cute ...
- C# 从服务器下载文件
一.//TransmitFile实现下载 protected void Button1_Click(object sender, EventArgs e) { /* 微软为Response对象提供了一 ...
- Java相关框架
框架 类型 设计(个人理解) HK2 自动注入框架 Jersey RESTful Jetty HTTP服务 Retrofit HTTP客户端 ActiveMQ 消息组件 主题.队列 Redis K-V ...