洛谷P2522 - [HAOI2011]Problem b
Description
进行\(T(T\leq10^5)\)次询问,每次给出\(x_1,x_2,y_1,y_2\)和\(d\)(均不超过\(10^5\)),求\(\sum_{i=x_1}^{x_2} \sum_{j=y_1}^{y_2} [gcd(i,j)=d]\)。
Solution
莫比乌斯反演入门题。
设\(calc(n,m)\)表示\(i\in[1,n],j\in[1,m]\)且\(gcd(i,j)=d\)的数对\((i,j)\)的个数。那么简单地进行容斥,可知\(ans=calc(x_2,y_2)-calc(x_1-1,y_2)-calc(x_2,y_1-1)+calc(x_1-1,x_2-1)\)。
于是考虑如何计算\(calc(n,m)\)。
\]
F(x) &= \sum_{x|d} f(d) \\
&= \sum_{x|d} \sum_{i=1}^n \sum_{j=1}^m [gcd(i,j)=d] \\
&= \sum_{k=1}^{⌊\frac{n}{x}⌋} \sum_{i=1}^n \sum_{j=1}^m [gcd(i,j)=kx] \\
&= ⌊\frac{n}{x}⌋⌊\frac{m}{x}⌋
\end{align*}$$ $gcd(i,j)=kx \Leftrightarrow x|i$且$x|j$,那满足条件的$(i,j)$就有$⌊\frac{n}{x}⌋⌊\frac{m}{x}⌋$对。再进行莫比乌斯反演:
$$ f(x)= \sum_{x|d} \mu(\frac{d}{x}) F(d) = \sum_{x|d} \mu(\frac{d}{x})⌊\frac{n}{d}⌋⌊\frac{m}{d}⌋ = \sum_{k=1}^{⌊\frac{n}{x}⌋} \mu(k)⌊\frac{n}{kx}⌋⌊\frac{m}{kx}⌋ $$这个做法看起来是$O(\dfrac{n}{x})$的。不过由于$⌊\dfrac{n}{i}⌋$最多只有$\sqrt n$种取值,所以我们可以以$O(\sqrt n)$的复杂度进行计算。
|i| 1| 2| 3|4|5|6|7|8|9|10|11|12|13|14|15|
|-|-|-|-|-|-|-|-|-|-|--|--|--|--|--|--|
|15/i|15|7|5|3|3|2|2|1|1|1|1|1|1|1|1|
观察发现,一个取值为$v$的区间是以$⌊\frac{n}{v}⌋$结尾的,下一个区间是从$⌊\frac{n}{v}⌋+1$开始的,模拟这一性质去计算即可。若对于区间$k\in[L,R]$有$⌊\frac{n}{kx}⌋=v_1,⌊\frac{m}{kx}⌋=v_2$,那么该区间对答案的贡献为$v_1v_2\sum_{k=L}^R \mu(k)$,预处理出$\mu(x)$的前缀和即可。
> 时间复杂度$O(T\sqrt {10^5})$。
##Code
```cpp
//[HAOI2011]Problem b
#include <algorithm>
#include <cstdio>
using std::min; using std::swap;
typedef long long lint;
inline char gc()
{
static char now[1<<16],*s,*t;
if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}
return *s++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
const int N=5e4+10;
int mu[N],pre[N];
int cntP,pr[N]; bool notP[N];
void getMu(int n)
{
mu[1]=1;
for(int i=2;i<=n;i++)
{
if(!notP[i]) pr[++cntP]=i,mu[i]=-1;
for(int j=1;j<=cntP;j++)
{
if((lint)i*pr[j]>n) break;
int x=i*pr[j]; notP[x]=true;
if(i%pr[j]) mu[x]=-mu[i]; else {mu[x]=0; break;}
}
}
for(int i=1;i<=n;i++) pre[i]=pre[i-1]+mu[i];
}
int k;
lint calc(int x,int y)
{
x/=k,y/=k; if(x>y) swap(x,y);
lint res=0;
for(int L=1,R;L<=x;L=R+1)
{
int v1=x/L,v2=y/L; R=min(x/v1,y/v2);
res+=1LL*(pre[R]-pre[L-1])*v1*v2;
}
return res;
}
int main()
{
getMu(5e4);
int Q=read();
while(Q--)
{
int fr1=read(),to1=read(),fr2=read(),to2=read(); k=read();
printf("%lld\n",calc(to1,to2)-calc(fr1-1,to2)-calc(to1,fr2-1)+calc(fr1-1,fr2-1));
}
return 0;
}
```
##P.S.
同样的题[洛谷P2257](https://www.luogu.org/problemnew/show/P2257)。\]
洛谷P2522 - [HAOI2011]Problem b的更多相关文章
- 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)
传送门 我们考虑容斥,设$ans(a,b)=\sum_{i=1}^a\sum_{j=1}^b[gcd(a,b)==k]$,这个东西可以和这一题一样去算洛谷P3455 [POI2007]ZAP-Quer ...
- 洛谷P2522 [HAOI2011]Problem b (莫比乌斯反演+容斥)
题意:求$\sum_{i=a}^{b}\sum_{j=c}^{d}[gcd(i,j)==k]$(1<=a,b,c,d,k<=50000). 是洛谷P3455 [POI2007]ZAP-Qu ...
- 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)
题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...
- 洛谷 P2522 [HAOI2011]Problem b (莫比乌斯反演+简单容斥)
题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...
- 洛谷 P2523 [HAOI2011]Problem c
洛谷1或洛谷2,它们是一样的题目,手动滑稽- 这一题我是想不出来, 但是我想吐槽一下坐我左边的大佬. 大佬做题的时候,只是想了几分钟,拍了拍大腿,干脆的道:"这不是很显然吗!" 然 ...
- 洛谷P2523 [HAOI2011]Problem c(计数dp)
题面 luogu 题解 首先,显然一个人实际位置只可能大于或等于编号 先考虑无解的情况 对于编号为\(i\),如果确认的人编号在\([i,n]\)中数量大于区间长度,那么就无解 记\(S[i]\)表示 ...
- 洛谷 P2519 [HAOI2011]problem a
传送门 考虑转化为求最多说真话的人数 设$f(i)$表示排名前$i$的人中最多说真话的人的数量,考虑转移,如果由$j$转移而来,可以设$[j,i]$之间的人全都分数相等,那么式子就是$f[i]=f[j ...
- 洛谷$P2523\ [HAOI2011]\ Problem\ c$ $dp$
正解:$dp$ 解题报告: 传送门$QwQ$ 首先港下不合法的情况.设$sum_i$表示$q\geq i$的人数,当且仅当$sum_i>n-i+1$时无解. 欧克然后考虑这题咋做$QwQ$. 一 ...
- P2522 [HAOI2011]Problem b (莫比乌斯反演)
题目 P2522 [HAOI2011]Problem b 解析: 具体推导过程同P3455 [POI2007]ZAP-Queries 不同的是,这个题求的是\(\sum_{i=a}^b\sum_{j= ...
随机推荐
- uvm_driver——老司机带带我
文件:src/comps/uvm_driver.svh类: uvm_driver uvm_driver继承(C++中叫继承)自uvm_component,其中定义了两个Ports:seq_item_p ...
- Objective-C Runtime Reference
This document describes the OS X Objective-C 2.0 runtime library support functions and data structur ...
- get和post请求及进程和线程及cookie和session的区别
get和post请求及进程和线程及cookie和session的区别 1.get和post请求的区别 get请求是指向服务器进行获取查询数据的请求,post请求指向服务器提交数据的请求. get请求如 ...
- Codeforces Round #316 (Div. 2) D Tree Requests
官方题解是离线询问,dfs树形转线性,然后二分找区间. 还有一种比较好的做法是直接dfs,将当前访问这个结点u相关的询问之前的状态存起来,然后访问完以后利用异或开关性,得到这颗子树上的答案. 代码是学 ...
- Bootstrap 表格2
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- 【动态规划】loj#2485. 「CEOI2017」Chase
有意思的可做dp题:细节有点多,值得多想想 题目描述 在逃亡者的面前有一个迷宫,这个迷宫由 nnn 个房间和 n−1n-1n−1 条双向走廊构成,每条走廊会链接不同的两个房间,所有的房间都可以通过走廊 ...
- Educational Codeforces Round 40千名记
人生第二场codeforces.然而遇上了Education场这种东西 Educational Codeforces Round 40 下午先在家里睡了波觉,起来离开场还有10分钟. 但是突然想起来还 ...
- [LUOGU] P1387 最大正方形
题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...
- 【IDE_PyCharm】PyCharm中配置当鼠标悬停时快速提示方法参数
方法一:通过在settings里面设置当鼠标至于方法之上时给出快速提示 方法二:按住Ctrl键,光标放在任意变量或方法上都会弹出该变量或方法的详细信息,点击鼠标还能跳转到变量或方法的定义处
- Xshell 配色方案 Ubuntu Solarized_Dark isayme
前言 最近在用Ubuntu,发现它的配色方案挺好看的,所以查了下有没有大神做过Xshell的Ubuntu配色方案. 一看,果然还是有大佬做了这个的. 三套配色配置如下: 1. Ubuntu的Solar ...