Description

对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数。

Input

第一行一个整数n,接下来n行每行五个整数,分别表示a、b、c、d、k

Output

共n行,每行一个整数表示满足要求的数对(x,y)的个数

Sample Input

2
2 5 1 5 1
1 5 1 5 2

Sample Output

14
3

HINT

100%的数据满足:1≤n≤50000,1≤a≤b≤50000,1≤c≤d≤50000,1≤k≤50000

Source

题解

前置知识:莫比乌斯反演

题目要求的是这个:
\[ ans = \sum _ {i=a}^b \sum _ {j=c}^d [gcd(i,j)=k] \]
我们可以利用二位前缀和的思想转化一下,然后求这个:
\[ ans = \sum _ {i=1}^n \sum _ {j=1}^m [gcd(i,j)=k] \]
把\(k\)除掉:
\[ ans= \sum _ {i=1}^{\lfloor \frac{n}{k} \rfloor} \sum _ {j=1}^{\lfloor \frac{m}{k} \rfloor} [gcd(i,j)=1] \]
然后对于后面的\(gcd\)莫比乌斯反演下,即:
\[ \sum _{d|n} \mu(d) =[ n=1 ] \]
带进去得:
\[ ans= \sum _ {i=1}^{\lfloor \frac{n}{k} \rfloor} \sum _ {j=1}^{\lfloor \frac{m}{k} \rfloor} \sum _{d|i\&d|j} \mu(d) \]
然后交换下枚举顺序,先枚举\(d\),得:
\[ \begin {align} ans&= \sum _d\mu(d) \sum _{i=1}^{\lfloor \frac{n}{kd} \rfloor} \sum _{j=1}^{\lfloor \frac{m}{kd} \rfloor} 1 \\ &= \sum _d\mu(d) \lfloor \frac{n}{kd} \rfloor \lfloor \frac{m}{kd} \rfloor \\ \end {align} \]
然后线筛下\(\mu\),整除分块下,就做完了。

这里最好是把\(n\)和\(m\)分别除以\(k\)后在整除分块,否则亲测会慢一倍,虽然\(bzoj\)心情好的话卡时限能过。。

#include<bits/stdc++.h>
using namespace std;#define int long long void read(int &x) {x=0;int f=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}void print(int x) {if(x<0) putchar('-'),x=-x;if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}const int maxn = 5e4+10;int mu[maxn],pri[maxn],vis[maxn],tot,T;void sieve() {mu[1]=1;for(int i=2;i<maxn;i++) {if(!vis[i]) pri[++tot]=i,mu[i]=-1;for(int j=1;j<=tot&&i*pri[j]<maxn;j++) {vis[i*pri[j]]=1;if(!(i%pri[j])) {mu[i*pri[j]]=0;break;}else mu[i*pri[j]]=-mu[i];}}for(int i=1;i<maxn;i++) mu[i]=mu[i]+mu[i-1];
}int calc(int n,int m,int k) {int d=1,ans=0;n/=k,m/=k;while(d<=n&&d<=m) {int pre=d;d=min(n/(n/d),m/(m/d));ans+=(n/d)*(m/d)*(mu[d]-mu[pre-1]);d++;}return ans;
}signed main() {sieve();read(T);for(int i=1,a,b,c,d,k;i<=T;i++) {read(a),read(b),read(c),read(d),read(k);write(calc(b,d,k)-calc(b,c-1,k)-calc(a-1,d,k)+calc(a-1,c-1,k));}return 0;
}

转载于:https://www.cnblogs.com/hbyer/p/10052719.html

[bzoj2301] [HAOI2011]Problem b相关推荐

  1. BZOJ2301: [HAOI2011]Problem b

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 6435  Solved: 2986 [Submi ...

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

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

  3. BZOJ2301:[HAOI2011]Problem b(莫比乌斯反演,容斥)

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

  4. [bzoj2301][HAOI2011]Problem b

    题目大意:给你$a,b,c,d,k(1\leqslant a,b,c,d,k\leqslant 5\times10^4)$,求$\displaystyle\sum\limits_{x=a}^b\dis ...

  5. bzoj2301: [HAOI2011]Problem b懵逼乌斯反演

    属于结果的和好求但是结果不好求的题 (轻易能得到以k的倍数为最大公约数的对数,但是不好直接求k) 所以一波反演结束 其实反演的时候完全没有反演的感觉,就是不停地恒等变形 算是懵逼乌斯反演最简单的例题 ...

  6. BZOJ2301: [HAOI2011]Problem b(莫比乌斯反演)

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

  7. BZOJ 2301 [HAOI2011]Problem b

    2301: [HAOI2011]Problem b Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函 ...

  8. [POI2007]ZAP-Queries [HAOI2011]Problem b 莫比乌斯反演

    1,[POI2007]ZAP-Queries ---题面--- 题解: 首先列出式子:$$ans = \sum_{i = 1}^{n}\sum_{j = 1}^{m}[gcd(i, j) == d]$ ...

  9. [HAOI2011]Problem c

    链接 P2523 [HAOI2011]Problem c 想法还是很巧妙的. 其实只是问一个先后顺序,因为编号相同的话,那么\(id\)小的就在前面,\(id\)大的就在后面. 所以我们考虑的是到底有 ...

最新文章

  1. 一个Java对象到底有多大?
  2. p2p webrtc服务器搭建系列1: 房间,信令,coturn打洞服务器
  3. Thread.currentThread().getContextClassLoader() 和 Class.getClassLoader()区别
  4. 人工智能,人脸识别门禁下的校园考勤
  5. L0对抗攻击JSMA的算法盘点
  6. Gitlab 项目上传
  7. 软件工程个人作业01;
  8. 他读书时挣了五十万,找工作时收获阿里腾讯快手等ssp offer
  9. 深度学习准备「爆破」著名的欧拉方程
  10. 大厂面试算法系列-如何从无序链表中移除重复项(一)-顺序删除
  11. abb机器人searchl报错_ABB机器人编程指令与函数
  12. rap2检测哪些接口在使用_使用四合一气体检测仪应注意哪些方面?-逸云天
  13. Vue之ElementUI导航菜单
  14. 从SQL Server中导入/导出 Excel 的基本方法
  15. Python学习笔记第二十四周(JavaScript补充)
  16. 使用ActiveMQ 传输文件 以及使用Jetty搭建内嵌文件服务器
  17. 圆角进度条,带数字居中显示的圆角进度条
  18. 再也不用花一天时间做ppt了
  19. Karl Rove和Dick Cheney加入了REST争论
  20. 笔记本电脑触摸板无法使用(失灵)解决方案 (win10和win7通用)

热门文章

  1. Android 适配(一)
  2. 从简单的信道预计说起
  3. 使用 C# 编程对RTF文档的支持
  4. C#心得与经验(二)
  5. opencv中的Mat类型
  6. Jquery使用$.Post方法,本地可以,服务器错误的处理方法...
  7. 网页获取客户端IP的两种方法
  8. docker 网络 不好用 docker: Error response from daemon: failed to create endpoint jovial_wing on network b
  9. 1.1 算法编译与调试
  10. 【翻译】Ext JS 4——Ajax和Rest代理处理服务器端一场和消息的方法