[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]\)

\[\sum_{i=1}^n \sum_{j=1}^m [gcd(i,j)=1]=\sum_{i=1}^n \sum_{j=1}^m \varepsilon(gcd(i,j))=\sum_{i=1}^n \sum_{j=1}^m \sum_{d|gcd(i,j)} \mu(d)
\]

变换求和顺序,先枚举\(d|gcd(i,j)\),

\[\sum_{d=1}^n \mu(d) \sum_{i=1}^n [d|i] \sum_{j=1}^m [d|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满足上面的条件,我们就可以大力反演了

\[f(x)= \sum_{x|d} \mu(d) F(\lfloor \frac{d}{x} \rfloor)
\]

虽然这看起来是无限求和,但我们实际上求到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)

\[f(1)= \sum_{1|d} \mu(d) F(\lfloor \frac{d}{1} \rfloor)= \sum_{d=1}^{min(n,m)} \mu(d) F(d)= \sum_{d=1}^{min(n,m)} \mu(d) \lfloor \frac{n}{d} \rfloor \lfloor \frac{m}{d} \rfloor
\]

两种方法殊途同归,都求出了最终答案$$\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 (莫比乌斯反演)(有证明)的更多相关文章

  1. [BZOJ 2299][HAOI 2011]向量 题解(裴蜀定理)

    [BZOJ 2299][HAOI 2011]向量 Description 给你一对数a,b,你可以任意使用(a,b), (a,-b), (-a,b), (-a,-b), (b,a), (b,-a), ...

  2. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

  3. [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块)

    [BZOJ 2154]Crash的数字表格(莫比乌斯反演+数论分块) 题面 求 \[\sum_{i=1}^{n} \sum_{j=1}^{m} \mathrm{lcm}(i,j)\] 分析 \[\su ...

  4. Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...

  5. BZOJ.2301.[HAOI2011]Problem B(莫比乌斯反演 容斥)

    [Update] 我好像现在都看不懂我当时在写什么了=-= \(Description\) 求\(\sum_{i=a}^b\sum_{j=c}^d[(i,j)=k]\) \(Solution\) 首先 ...

  6. BZOJ 2301 [HAOI2011]Problem b ——莫比乌斯反演

    分成四块进行计算,这是显而易见的.(雾) 然后考虑计算$\sum_{i=1}^n|sum_{j=1}^m gcd(i,j)=k$ 首先可以把n,m/=k,就变成统计&i<=n,j< ...

  7. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  8. BZOJ 3930 Luogu P3172 选数 (莫比乌斯反演)

    手动博客搬家:本文发表于20180310 11:46:11, 原地址https://blog.csdn.net/suncongbo/article/details/79506484 题目链接: (Lu ...

  9. P2522 [HAOI2011]Problem b (莫比乌斯反演)

    题目 P2522 [HAOI2011]Problem b 解析: 具体推导过程同P3455 [POI2007]ZAP-Queries 不同的是,这个题求的是\(\sum_{i=a}^b\sum_{j= ...

随机推荐

  1. pymysql基本操作

    https://www.cnblogs.com/woider/p/5926744.html https://www.runoob.com/python3/python3-mysql.html 注意: ...

  2. CF1103C Johnny Solving (Codeforces Round #534 (Div. 1)) 思维+构造

    题目传送门 https://codeforces.com/contest/1103/problem/C 题解 这个题还算一个有难度的不错的题目吧. 题目给出了两种回答方式: 找出一条长度 \(\geq ...

  3. Java课程作业02

    01. 一.设计思想: 第一种使用n!的公式直接计算,利用递归方法求n! 第二种使用递推的公式,利用递归返回求和. 二.程序流程图 三.源代码 import java.util.*;import ja ...

  4. [REPRINT]Properties vs. Getters and Setters

    http://www.python-course.eu/python3_properties.php Our new class means breaking the interface. The a ...

  5. hdu 4609: 3-idiots (FFT)

    题目链接 题意:从N个数中,选出三个两两不同的数,求这三个数能够作为一个三角形的三边长的概率. 题解:用一个数组num[]记录大小为 i 的数出现的次数,通过 num[] 卷 num[] 得到 num ...

  6. css 上下居中的广法

    方法1 .text{ text-align:center; font-size:0; } .text span{ vertical-align:middle; display:inline-block ...

  7. linux运维、架构之路-MHA高可用方案

    一.软件介绍          MHA(master high   availability)目前是MySQL高可用方面是一个相对成熟的解决方案.在切换过程中,mha能做到0-30s内自动完成数据库的 ...

  8. (41)freeRTOS之任务管理

    1. 简介: 在 FreeRTOS 中没有线程和进程的区别,只有一个被翻译成任务的程序,相当于进程的概念,拥有独立的栈空间. 对于实时性,可以分为 软实时.硬实时:桌面电脑的输入处理可以看做是软实时, ...

  9. UOJ428. 【集训队作业2018】普通的计数题

    http://uoj.ac/problem/428 题解 神仙题. 考虑最后一定是放了一个\(1\),然后把其他位置都删掉了. 再考虑到对于序列中的每个位置都对应了一次操作. 我们可以对于每个放\(1 ...

  10. Solr搜索引擎基础

    搜索引擎是指一个庞大的互联网资源数据库,如网页,新闻组,程序,图像等.它有助于在万维网上定位信息. 用户可以通过以关键字或短语的形式将查询传递到搜索引擎中来搜索信息. 搜索引擎然后搜索其数据库并向用户 ...