Portal

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(d) = \sum_{i=1}^n \sum_{j=1}^m [gcd(i,j)=d]
\]

\[\begin{align*}
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的更多相关文章

  1. 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)

    传送门 我们考虑容斥,设$ans(a,b)=\sum_{i=1}^a\sum_{j=1}^b[gcd(a,b)==k]$,这个东西可以和这一题一样去算洛谷P3455 [POI2007]ZAP-Quer ...

  2. 洛谷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 ...

  3. 洛谷P2522 [HAOI2011]Problem b(莫比乌斯反演)

    题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...

  4. 洛谷 P2522 [HAOI2011]Problem b (莫比乌斯反演+简单容斥)

    题目描述 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 输入输出格式 输入格式: 第一行一个整数 ...

  5. 洛谷 P2523 [HAOI2011]Problem c

    洛谷1或洛谷2,它们是一样的题目,手动滑稽- 这一题我是想不出来, 但是我想吐槽一下坐我左边的大佬. 大佬做题的时候,只是想了几分钟,拍了拍大腿,干脆的道:"这不是很显然吗!" 然 ...

  6. 洛谷P2523 [HAOI2011]Problem c(计数dp)

    题面 luogu 题解 首先,显然一个人实际位置只可能大于或等于编号 先考虑无解的情况 对于编号为\(i\),如果确认的人编号在\([i,n]\)中数量大于区间长度,那么就无解 记\(S[i]\)表示 ...

  7. 洛谷 P2519 [HAOI2011]problem a

    传送门 考虑转化为求最多说真话的人数 设$f(i)$表示排名前$i$的人中最多说真话的人的数量,考虑转移,如果由$j$转移而来,可以设$[j,i]$之间的人全都分数相等,那么式子就是$f[i]=f[j ...

  8. 洛谷$P2523\ [HAOI2011]\ Problem\ c$ $dp$

    正解:$dp$ 解题报告: 传送门$QwQ$ 首先港下不合法的情况.设$sum_i$表示$q\geq i$的人数,当且仅当$sum_i>n-i+1$时无解. 欧克然后考虑这题咋做$QwQ$. 一 ...

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

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

随机推荐

  1. perl在linux下通过date获取当前时间

    perl处理文件的时候最好添加上 处理的时间戳,获取系统的时间又多种方法,但是反引号是最原始的,不需要其他外界条件和lib的支持. my $now = `date "+%F %T" ...

  2. ubuntu 14.04 安装redis

    root@hett-PowerEdge-T30:~# sudo apt-get install redis-server Reading package lists... DoneBuilding d ...

  3. Cordova应用的JavaScript代码和自定义插件代码的调试

    我之前写过三篇Cordova相关的技术文章.当我们使用Cordova将自己开发的前端应用打包安装到手机上后,可能会遇到需要调试Cordova应用的时候. 本文就介绍Cordova应用的调试步骤. 如果 ...

  4. WPF中退出时显示是否保存数据提示

    一.通过窗体中的按钮实现退出时数据保存提示 Xaml: <Grid> <TextBlock HorizontalAlignment="Left" Margin=& ...

  5. 前端性能优化:细说JavaScript的加载与执行

    本文主要是从性能优化的角度来探讨JavaScript在加载与执行过程中的优化思路与实践方法,既是细说,文中在涉及原理性的地方,不免会多说几句,还望各位读者保持耐心,仔细理解,请相信,您的耐心付出一定会 ...

  6. java常考小程序

    private static void nineNineMulitTable(){ /** * 9*9乘法表 */ for (int i = 1,j = 1; j <= 9; i++) { Sy ...

  7. Lucene原理与代码分析

    http://www.cnblogs.com/forfuture1978/category/300665.html

  8. javase(6)_异常

    一.异常的概念 1.java异常是Java提供的用于处理程序中错误的一种机制. 2.所谓错误是程序在运行过程中发生的一些异常事件(如:除0,数组下标越界,文件不存在等). 3.Java程序的执行过程中 ...

  9. 几种常用库在CentOS下的编译

    1操作环境 通过命令查看操作系统版本信息: [root@localhost ~]# cat /proc/version Linux version 3.10.0-327.el7.x86_64 (bui ...

  10. linux文件权限更改命令chmod及数字权限

    chmod -change file mode bits :更改文件权限 chmod是用来改变文件或者目录权限的命令,但只有文件的属主和超级用户(root)才有这种权限. 更改文件权限的2种方式: 一 ...