题目大意:

一个数字组成一堆素因子的乘积,如果一个数字的素因子个数(同样的素因子也要多次计数)小于等于P,那么就称这个数是P的幸运数

多次询问1<=x<=n,1<=y<=m,P , 找到多少对gcd(x,y)是P的幸运数

这里k定为k是P的幸运数

这跟之前做的http://www.cnblogs.com/CSU3901130321/p/4902748.html CSU1325的题目很像,但是这里求sum[]要复杂了很多

本来是枚举k,d求sum的,但是每次询问,P都在变,而我们需要得到的是一整串的k,假定G是P最大的幸运数,那么稍微想一下 就可以知道

k是在[1,G]的区间内的任何整数

那么我们将询问离线处理,按P小优先排序

那么一个个查询的时候,不断将k值更新前缀和,前缀和更新就很容易使用树状数组加速更新了,那么之后查询同样用树状数组就行了

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <cmath>
  5. #include <vector>
  6. #include <algorithm>
  7. using namespace std;
  8. #define ll long long
  9. #define M 500000
  10. #define lowbit(x) x&(-x)
  11. int mu[M+] , prime[M] , check[M+] , tot , cnt[M+];//cnt[i]记录i有多少个素因子
  12. ll f[M+],ans[M+];
  13. int q;
  14. vector<int> vec[M+];
  15.  
  16. void init()
  17. {
  18. for(int i= ; i<=M ; i++) vec[cnt[i]].push_back(i);
  19. }
  20.  
  21. void get_mu()
  22. {
  23. mu[]= , cnt[]=;
  24. for(int i= ; i<=M ; i++){
  25. if(!check[i]){
  26. mu[i]=-;
  27. cnt[i]=;
  28. prime[tot++] = i;
  29. }
  30. for(int j= ; j<tot ; j++){
  31. if(prime[j]*i>M) break;
  32. check[i*prime[j]] = ;
  33. cnt[i*prime[j]] = cnt[i]+;
  34. if(i%prime[j]==) break;
  35. else mu[i*prime[j]] = -mu[i];
  36. }
  37. }
  38. }
  39.  
  40. struct Query{
  41. int n , m , p , id;
  42. void read(int i){
  43. scanf("%d%d%d" , &n , &m , &p);
  44. id=i;
  45. if(n>m) swap(n,m);
  46. }
  47. bool operator<(const Query &m)const {
  48. return p<m.p;
  49. }
  50. }qu[M];
  51.  
  52. void update(int x , int v)
  53. {
  54. for(int i=x ; i<=M ; i+=lowbit(i))
  55. f[i] = f[i]+v;
  56. }
  57.  
  58. ll query(int x)
  59. {
  60. ll ans = ;
  61. for(int i=x ; i> ; i-=lowbit(i)) ans = ans+f[i];
  62. return ans;
  63. }
  64.  
  65. void add_mul(int x)
  66. {
  67. int len = vec[x].size();
  68. for(int i= ; i<len ; i++){
  69. int fac = vec[x][i];
  70. for(int d= ; d*fac<=M ; d++){
  71. update(d*fac , mu[d]);
  72. }
  73. }
  74. }
  75.  
  76. ll cal(int n , int m)
  77. {
  78. ll ans=;
  79. for(int t= , last ; t<=n ; t=last+){
  80. last = min(n/(n/t) , m/(m/t));
  81. ans = ans+(ll)(query(last) - query(t-))*(n/t)*(m/t);
  82. }
  83. return ans;
  84. }
  85.  
  86. void solve()
  87. {
  88. int cur = ;
  89. for(int i= ; i<=q ; i++){
  90. while(cur<=qu[i].p) add_mul(cur++);
  91. ans[qu[i].id] = cal(qu[i].n , qu[i].m);
  92. }
  93. for(int i= ; i<=q ; i++) cout<<ans[i]<<endl;
  94. }
  95.  
  96. int main()
  97. {
  98. // freopen("a.in" , "r" , stdin);
  99. get_mu();
  100. init();
  101. scanf("%d" , &q);
  102. for(int i= ; i<=q; i++) qu[i].read(i);
  103. sort(qu+ , qu+q+);
  104. solve();
  105. return ;
  106. }

HDU 4746 莫比乌斯反演+离线查询+树状数组的更多相关文章

  1. BZOJ1878: [SDOI2009]HH的项链 (离线查询+树状数组)

    1878: [SDOI2009]HH的项链 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1878 Description: HH有一串由 ...

  2. ACdream 1127 Base Station (离线查询+树状数组)

    题目链接: http://acdream.info/problem?pid=1127 题目: 移动通信系统中,通信网的建立主要通过基站来完成. 基站可以分为主基站和子基站.子基站和各个移动用户进行连接 ...

  3. hdu 5869 区间不同GCD个数(树状数组)

    Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K ( ...

  4. 【bzoj4540】[Hnoi2016]序列 单调栈+离线+扫描线+树状数组区间修改区间查询

    题目描述 给出一个序列,多次询问一个区间的所有子区间最小值之和. 输入 输入文件的第一行包含两个整数n和q,分别代表序列长度和询问数.接下来一行,包含n个整数,以空格隔开,第i个整数为ai,即序列第i ...

  5. 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组

    题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 ...

  6. hdu 6203 ping ping ping(LCA+树状数组)

    hdu 6203 ping ping ping(LCA+树状数组) 题意:给一棵树,有m条路径,问至少删除多少个点使得这些路径都不连通 \(1 <= n <= 1e4\) \(1 < ...

  7. bzoj3529(莫比乌斯反演+离线+树状数组)

    在你以为理解mobus的时候,苦苦想通过化简公式来降低复杂度时,这题又打了我一巴掌. 看来我并没有理解到acmicpc比赛的宗旨啊. 这么多次查询可以考虑离线操作,使用树状数组单点更新. /***** ...

  8. HDU 4630 No Pain No Game 树状数组+离线查询

    思路参考 这里. #include <cstdio> #include <cstring> #include <cstdlib> #include <algo ...

  9. HDU 5869 Different GCD Subarray Query 树状数组+离线

    Problem Description This is a simple problem. The teacher gives Bob a list of problems about GCD (Gr ...

随机推荐

  1. Entity Framework && Lambda

    Lambda表达式详细总结 C# 代码了解委托.匿名方法.Lambda 表达式和闭包本质 将使用了C# Lambda表达式的程序集反编译后,我们发现,它实际上和匿名方法没有什么不同.Lambda的输入 ...

  2. js 获取参数

    <html lang="en"> <head> <meta charset="UTF-8"> <meta name=& ...

  3. javascript,jQuery,trim()

    JavaScript trim() Syntax string.trim() The trim() method removes whitespace from both sides of a str ...

  4. linux bash快捷键

    bash快捷键 CTRL+F 光标向前移动一个字母 CTRL+B 光标向后移动一个字母 CTRL+A HOME CTRL+E END

  5. 初识python第一天

    一.python简介 1.1 python的诞生 python的创始人吉多.范罗苏姆(Guido van Rossum),他在开发python语言之前曾使用过几年的ABC语言,ABC是一门主要用于教学 ...

  6. zigbee学习之路(九):串口(发送)

    一.前言 今天,我们来学习和实验串口模块方面的,串口通信是我们常用的通信手段,通过串口交互,我们可以很容易的和pc机进行数据的交换和发送,所以我们今天就来学习一下.这个实验所进行的功能是一开始CC25 ...

  7. Linux phpbb论坛的安装(中文版)

    1:建立文件夹

  8. Unity在编辑器状态下清空控制台信息

    public static void ClearConsole() { var assembly = System.Reflection.Assembly.GetAssembly(typeof(Uni ...

  9. -webkit-transform:scale(1.04)放大缩小效果

    <p>[鼠标移动进去图片放大一倍效果:运用了-webkit-transform:scale(1.04)效果]</p> 如图:鼠标移动上去的时候图片放大一倍的效果, <!D ...

  10. Jquery 复习练习(02)Javascript 与jquery 互转 onclick 与click区别

    Javascript 与jquery 互转 jquery 为<script src="jquery-1.8.3.js"></script> 以checkbo ...