[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 ...
随机推荐
- RTL2832U+R820T电视棒windows下安装sdr# 以及搭建ADS-B使用VirtualRadar看飞机的教程
本文中提到的软件随后我会打包给出下载地址.这篇文章是我根据网上的教程和自己的经验修改的详细版本,为了方便入门新手.先来说说RTL2832U+R820T在windows下安装sdr#的方法.首先科普下s ...
- 继承spring的validator接口,实现对数据的校验
在org.springframework.validation这个包中提供了一些对数据校验的方法,其中Validator接口是其中的一个. 现在用Validator接口,完成对数据的校验. 第一步:先 ...
- powershell for rename server name
Rename server name if server has not yet joined AD $Hostname = "newname" $username = " ...
- es6+最佳入门实践(14)
14.模版字符串 模版字符串(template string)是增强版的字符串,定义一个模版字符串需要用到反引号 let s = `这是一个模版字符串` console.log(s) 14.1.模版字 ...
- JRE集成到Tomcat
将jdk集成到tomcat里面(不用客户安装JRE) 或者 tomcat使用指定的jdk_ 给客户安装软件的时候,也许客户不想你在人家机器的环境变量里设置来设置去,那么就要在tomcat里指定要使用的 ...
- [BZOJ2243][SDOI2011]染色 解题报告|树链剖分
Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的颜色段数量(连续相同颜色被认为是同一段),如“ ...
- The service base of EF I am using
using CapMon.Data; using System; using System.Collections.Generic; using System.Linq; using System.T ...
- [bzoj3306]树——树上倍增+dfs序+线段树
Brief Description 您需要写一种数据结构,支持: 更改一个点的点权 求一个子树的最小点权 换根 Algorithm Design 我们先忽略第三个要求. 看到要求子树的最小点权,我们想 ...
- USACO月赛2005 january volume
2013-09-18 08:12 由题可知,ans=∑i ∑j(x[i]-x[j]) 最后整理完之后应该是不同系数的X[i]相加,所以这道题就成了求不同x[i]的系数 对于X[i],它需要减前面(i ...
- PHP HERE DOCUMENT
转自: http://www.codeweblog.com/php%E4%B8%ADheredoc%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95/ Here ...