传送门:2301: [HAOI2011]Problem b

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

分析:gcd(x,y)==k等价于gcd(x/k,y/k)==1,根据莫比乌斯反演很容易求出[1,n][1,m]的gcd(x,y)==1的对数,但询问有50000个,直接去计算肯定会TLE,这里得分块处理加速计算,因为对于(n/i)和(m/i)在一定区间内的值是一定的,根据这点可以每次跳过这段的计算。

这里的分块有点类似求和sum=n/1+n/2+n/3+...+n/(n-1)+n/n.直接去算O(n),分块O(sqrt(n)).

  1. #pragma comment(linker,"/STACK:1024000000,1024000000")
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <string>
  5. #include <cmath>
  6. #include <limits.h>
  7. #include <iostream>
  8. #include <algorithm>
  9. #include <queue>
  10. #include <cstdlib>
  11. #include <stack>
  12. #include <vector>
  13. #include <set>
  14. #include <map>
  15. #define LL long long
  16. #define mod 100000000
  17. #define inf 0x3f3f3f3f
  18. #define eps 1e-6
  19. #define N 50000
  20. #define lson l,m,rt<<1
  21. #define rson m+1,r,rt<<1|1
  22. #define PII pair<int,int>
  23. using namespace std;
  24. inline int read()
  25. {
  26. char ch=getchar();int x=,f=;
  27. while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
  28. while(ch<=''&&ch>=''){x=x*+ch-'';ch=getchar();}
  29. return x*f;
  30. }
  31. bool vis[N+];
  32. int mu[N+],prime[N+],sum[N+];
  33. void Mobius()
  34. {
  35. memset(vis,false,sizeof(vis));
  36. mu[]=;
  37. int tot=;
  38. for(int i=;i<=N;i++)
  39. {
  40. if(!vis[i])
  41. {
  42. prime[tot++]=i;
  43. mu[i]=-;
  44. }
  45. for(int j=;j<tot;j++)
  46. {
  47. if(i*prime[j]>N)break;
  48. vis[i*prime[j]]=true;
  49. if(i%prime[j]==)
  50. {
  51. mu[i*prime[j]]=;
  52. break;
  53. }
  54. else
  55. {
  56. mu[i*prime[j]]=-mu[i];
  57. }
  58. }
  59. }
  60. for(int i=;i<=N;i++)sum[i]=sum[i-]+mu[i];
  61. }
  62. LL solve(int n,int m)
  63. {
  64. LL res=;
  65. if(n>m)swap(n,m);
  66. for(int i=,last=;i<=n;i=last+)
  67. {
  68. last=min(n/(n/i),(m/(m/i)));
  69. res+=1LL*(sum[last]-sum[i-])*(n/i)*(m/i);
  70. }
  71. return res;
  72. }
  73. int main()
  74. {
  75. int T,a,b,c,d,k;
  76. Mobius();
  77. scanf("%d",&T);
  78. while(T--)
  79. {
  80. scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
  81. a--;c--;
  82. LL ans=solve(b/k,d/k)-solve(b/k,c/k)-solve(a/k,d/k)+solve(a/k,c/k);
  83. printf("%lld\n",ans);
  84. }
  85. }

bzoj2301(莫比乌斯反演+分块)的更多相关文章

  1. bzoj2301 [HAOI2011]Problem b【莫比乌斯反演 分块】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 很好的一道题.首先把每个询问转化为4个子询问,最后的结果就是这四个子询问的记过加加减减 ...

  2. BZOJ 2301 Problem b(莫比乌斯反演+分块优化)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37166 题意:对于给出的n个询问,每次求有多少个数对(x,y),满 ...

  3. BZOJ 4407 于神之怒加强版 (莫比乌斯反演 + 分块)

    4407: 于神之怒加强版 Time Limit: 80 Sec  Memory Limit: 512 MBSubmit: 1067  Solved: 494[Submit][Status][Disc ...

  4. bzoj 2301 [HAOI2011]Problem b(莫比乌斯反演+分块优化)

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

  5. ACdream 1148(莫比乌斯反演+分块)

    传送门:GCD SUM 题意:给出N,M执行如下程序:long long  ans = 0,ansx = 0,ansy = 0;for(int i = 1; i <= N; i ++)   fo ...

  6. [bzoj2301]Problem b莫比乌斯反演+分块优化

    题意: $\sum\limits_{\begin{array}{*{20}{c}}{a < = x < = b}\\{c < = y < = d}\end{array}} {\ ...

  7. BZOJ 2301 Problem b(莫比乌斯反演+分块优化)

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

  8. JZYZOJ1518 [haoi2011]b 莫比乌斯反演 分块 容斥

    http://172.20.6.3/Problem_Show.asp?id=1518最开始只想到了n^2的写法,肯定要超时的,所以要对求gcd的过程进行优化.首先是前缀和容斥,很好理解.第二个优化大致 ...

  9. BZOJ2301 莫比乌斯反演

    题意:a<=x<=b,c<=y<=d,求满足gcd(x,y)=k的数对(x,y)的数量         ((x,y)和(y,x)不算同一个) 比hdu1695多加了个下界,还有 ...

随机推荐

  1. teamviewer无法启动

    在 Linux.Mac OS X和 Windows下都可以用,但在 Linux 下无法启动时怎么办? 笔者回家工作时,都会用 Teamviewer 连线到其他 Linux 桌面,但某天起 Teamvi ...

  2. 公司简介 - CCDI悉地国际-工程实践专业服务的引领者

    公司简介 - CCDI悉地国际-工程实践专业服务的引领者 关于悉地国际         CCDI悉地国际(以下简称"CCDI")创立于1994年,是在城市建设和开发领域从事综合专业 ...

  3. EasyUI - 后台管理系统 - 增加,删除,修改

    效果: html代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ad ...

  4. XML 关键字

    SGML--Standard Generalized Marked Language 标准通用标记语言GML--Generalized Marked Language 通用标记语言XML--Extes ...

  5. HDU 3068 最长回文 Manacher算法

    Manacher算法是个解决Palindrome问题的O(n)算法,能够说是个超级算法了,秒杀其它一切Palindrome解决方式,包含复杂的后缀数组. 网上非常多解释,最好的解析文章当然是Leetc ...

  6. Python集成开发环境(Eclipse+Pydev)

    刚開始学习python,就用Editplus, Notepad++来写小程序, 后来接触了Sublime Text2.认为很不错,没事写写代码.就用编辑器Sublime Text2,最好再配搭一个ap ...

  7. (android高仿系列)今日头条 --新闻阅读器 (三) 完结 、总结 篇

    从写第一篇今日头条高仿系列开始,到现在已经过去了1个多月了,其实大体都做好了,就是迟迟没有放出来,因为我觉得,做这个东西也是有个过程的,我想把这个模仿中一步一步学习的过程,按照自己的思路写下来,在根据 ...

  8. 进阶:案例三: Upload File using WebDynpro

    1.节点创建,其中DATASOURCE存放uploadfile名称 2.layout布局 3.upload事件代码: method ONACTIONUPLOAD . DATA: lo_Node typ ...

  9. 使用JDBC进行数据库的事务操作(1)

    本篇讲述数据库中非常重要的事务概念和如何使用MySQL命令行窗口来进行数据库的事务操作.下一篇会讲述如何使用JDBC进行数据库的事务操作. 事务是指数据库中的一组逻辑操作,这个操作的特点就是在该组逻辑 ...

  10. Wireshark入门与进阶---数据包捕获与保存的最基本流程

    Wireshark入门与进阶系列(一) "君子生非异也.善假于物也"---荀子 本文由CSDN-蚍蜉撼青松 [主页:http://blog.csdn.net/howeverpf]原 ...