[BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)
[BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)
题面
T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[gcd(i,j)=k]\)
\(T,a,b,c,d,k\le 5\times 10^4\)
分析
\(O(n^2)\)暴力显然是不可行的,我们考虑优化。
首先易得\(k\times gcd(i,j)=gcd(ki,kj)\),那么我们可以把a,b,c,d都除上k,问题就变成了\(\sum _{i=a/k}^{b/k}\sum _{j=c/k}^{d/k}[gcd(i,j)=1]\)(之后的除法若未说明,均为下去整)
差分一下,我们只要求出\(\sum_{i=1}^n \sum_{j=1}^m [gcd(i,j)=1]\),然后二维前缀和相减一下就可以了
1.运用狄利克雷卷积证明
根据结论\(\left(\mu\ast I\right)=\varepsilon\),即\(\varepsilon (n)= \sum _{d|n} \mu(n)\),我们可以化简问题式子
由定义知\(\epsilon(x)=[x=1]\)
\]
变换求和顺序,先枚举\(d|gcd(i,j)\),
其中$[d|i]$表示i为d的倍数的时候i才会对答案有贡献
显然1~n中d的倍数有n/d个
最终答案为$$\sum_{d=1}^{min(n,m)} \mu(d) \lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor\]
2.运用莫比乌斯反演的第二种形式证明
莫比乌斯反演的第二种形式是
若\(F(n) =\sum _{n|d} f(d)\),那么\(f(n)= \sum_{n|d} \mu(d) F(\lfloor \frac{d}{n} \rfloor)\)
这里d表示n的倍数
既然要用到莫比乌斯反演,我们首先就要找到合适的F和f
设
\(f(x)=\sum_{i=1}^n \sum_{i=1}^m [gcd(i,j)=x]\),(gcd为x的(x,y)的对数)
\(F(x)= \sum_{i=1}^n \sum_{i=1}^m [x |gcd(i,j)]\), (gcd为x或x的倍数的(x,y)的对数)
显然$F(x)=\sum f(i) $(i是x的倍数),因为gcd(x,i)能整除x,那i一定能整除x。
既然F,f满足上面的条件,我们就可以大力反演了
\]
虽然这看起来是无限求和,但我们实际上求到min(n,m)就可以了,因为gcd(i,j)(i<n,j<m)不可能超过i,j中的最小值。
注意到\(F(x)= \sum_{i=1}^n \sum_{i=1}^m [x |gcd(i,j)]= \lfloor \frac{n}{x} \rfloor \lfloor \frac{m}{x} \rfloor\),因为gcd(i,j)为x的倍数,那么i,j一定都被x整除,显然1~n中x的倍数有n/x个
我们求的答案实际上是f(1)
\]
两种方法殊途同归,都求出了最终答案$$\sum_{d=1}^{min(n,m)} \mu(d) \lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor$$
数论分块优化
暴力枚举求解$$\sum_{d=1}^n \mu(d) \lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor$$的复杂度为\(O(n)\),仍然较高,观察到d比较大的时候n/d的值变化不大,如n=6时n/4=n/5=n/6.
因此我们可以找出所有下取整值相同的区间[l,r],再用$\lfloor \frac{n}{l} \rfloor\sum_{i=l}^r \mu(d) $就可以求出答案,求和部分可以前缀和预处理。对于一个块,假设它的起始位置的下标为l,那么可以得到的是,它的结束位置的下标为n/(n/l)
这样的复杂度是\(O(\sqrt n)\)的,T次询问复杂度为\(O(T\sqrt n)\),可以通过本题
long long ans=0;
int l,r;
for(l=1;l<=m;l=r+1){
r=min(n/(n/l),m/(m/l));
ans+=(sum_mu[r]-sum_mu[l-1])*(n/l)*(m/l);
}
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 50000
using namespace std;
typedef long long ll;
int cnt;
bool vis[maxn+5];
int prime[maxn+5];
int mu[maxn+5];
ll sum_mu[maxn+5];
void sieve(int n){
mu[1]=1;
for(int i=2;i<=n;i++){
if(!vis[i]){
prime[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt&&i*prime[j]<=n;j++){
vis[i*prime[j]]=1;
if(i%prime[j]==0){
mu[i*prime[j]]=0;
break;
}else mu[i*prime[j]]=-mu[i];
}
}
for(int i=1;i<=n;i++) sum_mu[i]=sum_mu[i-1]+mu[i];
}
int t;
int a,b,c,d,e;
ll solve(int n,int m){
n/=e;
m/=e;
if(n<m) swap(n,m);
ll ans=0;
int l,r;
for(l=1;l<=m;l=r+1){
r=min(n/(n/l),m/(m/l));
ans+=(sum_mu[r]-sum_mu[l-1])*(n/l)*(m/l);
}
return ans;
}
int main(){
sieve(maxn);
scanf("%d",&t);
while(t--){
scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
ll ans=solve(b,d)-solve(a-1,d)-solve(b,c-1)+solve(a-1,c-1);
printf("%lld\n",ans);
}
}
[BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)的更多相关文章
- [BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)
[BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), ...
- [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)
[BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...
- [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)
[BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...
- 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(莫比乌斯反演 容斥)
[Update] 我好像现在都看不懂我当时在写什么了=-= \(Description\) 求\(\sum_{i=a}^b\sum_{j=c}^d[(i,j)=k]\) \(Solution\) 首先 ...
- BZOJ 2301 [HAOI2011]Problem b ——莫比乌斯反演
分成四块进行计算,这是显而易见的.(雾) 然后考虑计算$\sum_{i=1}^n|sum_{j=1}^m gcd(i,j)=k$ 首先可以把n,m/=k,就变成统计&i<=n,j< ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4032 Solved: 1817[Submit] ...
- BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)
手动博客搬家:本文发表于20180310 11:46:11, 原地址https://blog.csdn.net/suncongbo/article/details/79506484 题目链接: (Lu ...
- P2522 [HAOI2011]Problem b (莫比乌斯反演)
题目 P2522 [HAOI2011]Problem b 解析: 具体推导过程同P3455 [POI2007]ZAP-Queries 不同的是,这个题求的是\(\sum_{i=a}^b\sum_{j= ...
随机推荐
- uoj280 【UTR #2】题目难度提升 堆维护中位数+set
题目传送门 http://uoj.ac/problem/280 题解 这道题很妙啊. 这种题目如果给予选手足够的时间,每一个选手应该都能做出来. 大概就是核心思路看上去很简单,但是想要推出来并不简单. ...
- vue开发使用vue-particles如何兼容IE11?
最近开发vue项目,项目有一个粒子特效使用vue-particles.项目用vue-cli构建,webpack打包完毕,丢到服务器,chrome访问完美,测试360和Edge也正常.遗憾的是,在IE1 ...
- idea使用"svn"到项目报错Error:Cannot run program "svn" (in directory "E:\XXXXXX"):CreateProcess error=2,
使用新项目工具idea界面上导入svn项目报错: Error:Cannot run program "svn" (in directory "D:\XXXXXX" ...
- int转字符串 stringstream
1. 设定一个任意数字串,数出这个数中的偶数个数,奇数个数,及这个数中所包含的所有位数的总数,将答案按 “偶-奇-总” 的位序,排出得到新数.重复进行,最后会得到 123. #include<i ...
- 【CF1252G】Performance Review(线段树)
题意: n,q<=1e5,a[i],b[i][j]<=1e9,保证能力值互不相同,询问之间保留前面的影响 思路:其实把大于a[1]的看成0,小于的看成1,设第i天小于a[1]的有b[i]个 ...
- Oracle--创建TRIGGER实现跟踪用户登录信息
---创建日志表记录用户登录信息create table user_log( user_id VARCHAR2(30), session_id NUMBER(10), ...
- 【转】SQL Pretty Printer for SSMS 很不错的SQL格式化插件
源地址:https://www.cnblogs.com/leospace/archive/2012/09/04/SQL_Pretty_Printer_for_SSMS.html 写SQL语句或者脚本时 ...
- 关于Idea热部署,修改代码不需要重启tomcat
- java配置环境变量 jdk1.8
1.首先第一步安装JDK window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.oracle.com/technetwork/java/j ...
- Python 列表反转显示方法
第一种,使用reversed 函数,reversed返回的结果是一个反转的迭代器,我们需要对其进行 list 转换 listNode = [1,2,3,4,5] newList = list(reve ...