BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b
Time Limit: 50 Sec Memory Limit: 256 MB
Submit: 4032 Solved: 1817
[Submit][Status][Discuss]
Description
Input
第一行一个整数n,接下来n行每行五个整数,分别表示a、b、c、d、k
Output
共n行,每行一个整数表示满足要求的数对(x,y)的个数
Sample Input
2 5 1 5 1
1 5 1 5 2
Sample Output
3
HINT
100%的数据满足:1≤n≤50000,1≤a≤b≤50000,1≤c≤d≤50000,1≤k≤50000
研究了好长时间差不多明白了,第一道莫比乌斯反演,好多值得学习的东西
首先,由容斥原理易得答案为
cal(b,d,k)-cal(a-1,d,k)-cal(b,c-1,k)+cal(a-1,c-1,k)
- 这个问题等价于询问有多少个数对(x,y)满足1<=x<=[n/k],1<=y<=[m/k]且x与y互质
- 考虑莫比乌斯反演,
- f(i)为1<=x<=n,1<=y<=m且gcd(x,y)=i的数对(x,y)的个数
- F(i)为1<=x<=n,1<=y<=m且i|gcd(x,y)的数对(x,y)的个数
- 显然,F(i)=(n/i)*(m/i) 整除,并且F(i)=Σ{i|d} f(d) 是倍数和
- 反演后,f(i)=Σ{i|d} miu(d/i)*F(d)=Σ{i|d} miu(d/i)*(n/d)*(m/d)
- 但这样每个询问复杂度是O(n)
- 观察式子,发现[n/d] 最多有2sqrt(n) 个取值(整除....一段相同 参考链接)
- 那么 (n/d)*(m/d)就至多有2sqrt(n)+2sqrt(m)个取值 (当然不是乘起来,因为对于一个n只有一个值而不是2sqrt(n)个)
- 计算每个询问时枚举这2sqrt(n)+2sqrt(m)个取值,因为一个取值是一段,要乘一段miu的和,所以对莫比乌斯函数维护一个前缀和,就可以在sqrt(n)时间内出解
【WT1(WT是从小新那里学来的....发现竟然是问题的首字母):】
f(k)=Σ{k|d} miu(d/k)*(n/d)*(m/d)这个式子怎么计算?
d是k的倍数,取值k,2*k,3*k,...,t*k
f(k)=Σ{i=1..n/k} miu(i)*(n/(k*i))*(m/(k*i)) //注意,【整除满足 x/a/b=a/(a*b)】
更一般的:
f(k)=Σ{k|d} miu(d/k)*F(d)
--> f(k)=Σ{i=1..n/k}miu(i)*F(i*k)
【WT2 】如何按照整除取值相同分段?
当前除法为n/i,与它相同的上界到n/(n/i)
为什么?我想了好久,最后的方法是
考虑n是一段区间,n=p*i+q,被分成p段长为i的
i每增加1 q就减少p,(这时候整除的取值没有改变),最多能减少q/p个,那么此时i=i+q/p=(i*p+q)/p=n/(n/i)
注意:miu的区间和*(n/i)*(m/i)可能会溢出,对拍都没有发现.......
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=5e4+;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,a,b,c,d,k;
bool notp[N];
ll p[N],mu[N];
void sieve(){
mu[]=;
for(int i=;i<=N-;i++){
if(!notp[i]) p[++p[]]=i,mu[i]=-;
for(int j=;j<=p[]&&i*p[j]<=N-;j++){
int t=i*p[j];
notp[t]=;
if(i%p[j]==){
mu[t]=;
break;
}
mu[t]=-mu[i];
}
}
for(int i=;i<=N-;i++) mu[i]+=mu[i-];
}
ll cal(int n,int m,int k){
n/=k;m/=k;
if(n>m) swap(n,m);
ll ans=;int r=;
for(int i=;i<=n;i=r+){
r=min(n/(n/i),m/(m/i));
ans+=(mu[r]-mu[i-])*(n/i)*(m/i);
}
return ans;
}
int main(int argc, const char * argv[]) {
//freopen("in.txt","r",stdin);
//freopen("1.out","w",stdout);
sieve();
int T=read();
while(T--){
a=read();b=read();c=read();d=read();k=read();
printf("%lld\n",cal(b,d,k)-cal(a-,d,k)-cal(b,c-,k)+cal(a-,c-,k));
} return ;
}
附:还有另一种思考的角度,从莫比乌斯函数的角度考虑,殊途同归
复制鏼爷的题解
推导:
令
用莫比乌斯函数的性质把求和的式子换掉,
其中,更换求和指标,
容易知道单调不上升,且最多有
种不同的取值。所以按取值分成
个段分别处理,一个连续段内的和可以用预处理出的莫比乌斯函数前缀和求出
BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】的更多相关文章
- [bzoj2301][HAOI2011]Problem B —— 莫比乌斯反演+容斥原理
题意 给定a, b, c, d, k,求出: \[\sum_{i=a}^b\sum_{j=c}^d[gcd(i, j) = k]\] 题解 为方便表述,我们设 \[calc(\alpha, \beta ...
- BZOJ2301: [HAOI2011]Problem b 莫比乌斯反演
分析:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 然后对于求这样单个的gcd(x,y)=k的, ...
- BZOJ2301:[HAOI2011]Problem b(莫比乌斯反演,容斥)
Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...
- [HAOI2011][bzoj2301] Problem b [莫比乌斯反演+容斥原理+分块前缀和优化]
题面: 传送门 有洛谷就尽量放洛谷链接呗,界面友好一点 思路: 和HDU1695比较像,但是这一回有50000组数据,直接莫比乌斯反演慢慢加的话会T 先解决一个前置问题:怎么处理a,c不是1的情况? ...
- [BZOJ1101&BZOJ2301][POI2007]Zap [HAOI2011]Problem b|莫比乌斯反演
对于给定的整数a,b和d,有多少正整数对x,y,满足x<=a,y<=b,并且gcd(x,y)=d. 我们可以令F[n]=使得n|(x,y)的数对(x,y)个数 这个很容易得到,只需要让x, ...
- P2522 [HAOI2011]Problem b (莫比乌斯反演)
题目 P2522 [HAOI2011]Problem b 解析: 具体推导过程同P3455 [POI2007]ZAP-Queries 不同的是,这个题求的是\(\sum_{i=a}^b\sum_{j= ...
- Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...
- BZOJ 2301: [HAOI2011]Problem b 莫比乌斯反演
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 1007 Solved: 415[Submit][ ...
- BZOJ.2301.[HAOI2011]Problem B(莫比乌斯反演 容斥)
[Update] 我好像现在都看不懂我当时在写什么了=-= \(Description\) 求\(\sum_{i=a}^b\sum_{j=c}^d[(i,j)=k]\) \(Solution\) 首先 ...
随机推荐
- Hadoop Shell命令大全
hadoop支持命令行操作HDFS文件系统,并且支持shell-like命令与HDFS文件系统交互,对于大多数程序猿/媛来说,shell-like命令行操作都是比较熟悉的,其实这也是Hadoop的极大 ...
- Kafka 文档用例
1.2 用例 以下是一些Kafka 常见的用例.关于功能方面的一些概念,可以看这篇博客:http://engineering.linkedin.com/distributed-systems/log- ...
- 【NLP】条件随机场知识扩展延伸(五)
条件随机场知识扩展延伸 作者:白宁超 2016年8月3日19:47:55 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务中都有应 ...
- 微信开发之Ngrok环境准备
一.为什么要使用ngrok? 各位肯定都知道,做微信开发,我们的开发服务器需要和微信服务器做交互,SO,我们需要准备一台放置在公网的服务器,能够使得我们的服务器可以正常访问微信服务器,并且微信服务器也 ...
- php内核分析(二)-ZTS和zend_try
这里阅读的php版本为PHP-7.1.0 RC3,阅读代码的平台为linux ZTS 我们会看到文章中有很多地方是: #ifdef ZTS # define CG(v) ZEND_TSRMG(comp ...
- ASP.NET Core 静态文件及JS包管理器(npm, Bower)的使用
在 ASP.NET Core 中添加静态文件 虽然ASP.NET主要大都做着后端的事情,但前端的一些静态文件也是很重要的.在ASP.NET Core中要启用静态文件,需要Microsoft.AspNe ...
- JS性能优化
1.不要在同一行声明多个变量. 2.请使用 ===/!==来比较true/false或者数值 3.使用对象字面量替代new Array这种形式 4.不要使用全局函数. 5.Switch语句必须带有de ...
- .Net语言 APP开发平台——Smobiler学习日志:快速实现应用中的图片、声音等文件上传功能
最前面的话:Smobiler是一个在VS环境中使用.Net语言来开发APP的开发平台,也许比Xamarin更方便 样式一 一.目标样式 我们要实现上图中的效果,需要如下的操作: 1.从工具栏上的&qu ...
- C# 高效编程笔记1
C# 高效编程笔记1 1.使用属性而不是可访问的数据成员 (1).NET Framework中的数据绑定类仅支持属性,而不支持共有数据成员 (2)属性相比数据成员更容易修改 2.用运行时常量(read ...
- Angular通过XHR加载模板而限制使用file://(解决方案)
编写angular项目时,遇到此困难: angular.js:12011 XMLHttpRequest cannot load file:///E:/angular/imooc/chapter2/bo ...