题意:从1~1000,000的每个自然数质因子分解,不同因子的个数作为其f 值,比如12=2*2*3,则f(12)=2。将100万个数转成他们的f值后变成新的序列seq。接下来T个例子,每个例子一个询问区间seq[L,R]。问该子序列中任意两个不同下标的数,他们的GCD值最大为多少?

思路:

(1)质因子分解,用筛法先将质数先全部出来。

(2)对每个自然数求其f值,即将其质因子分解后的不同因子个数,作为seq序列。

(3)扫一遍seq,用另一个数组记录下标i之前有多少个1、2、3、4...。因为seq序列中最大的数不超过10,所以可以统计,以方便能在O(1)内得到一个区间内有多少个值为x的元素。

(4)对于每个询问L和R,将所有元素装入新的序列中,准备求GCD。注意:相同数字不必超过2个,即新序列中的元素顶多出现2次。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=;
  4. vector<int> prime;
  5. bool seq[N];
  6. int cnt[N];
  7. int fval[N][];
  8.  
  9. void pre_cal()
  10. {
  11. memset(seq,,sizeof(seq));
  12. memset(cnt,,sizeof(cnt));
  13. memset(fval,,sizeof(fval));
  14.  
  15. for(int i=; i*i<N; i++) //所有质数都是false;
  16. {
  17. if(!seq[i]) continue;
  18. for(int j=i*i; j<N; j+=i) seq[j]=;
  19. }
  20.  
  21. for(int i=; i<N; i++) if(seq[i]) prime.push_back(i);
  22.  
  23. for(int i=; i<N; i++) //求f值
  24. {
  25. int t=i;
  26. for(int j=; j<prime.size()&& prime[j]<i && t!=; j++)
  27. {
  28. if( seq[t] ) //若是质数,不用再求了
  29. {
  30. cnt[i]++;
  31. break;
  32. }
  33.  
  34. if( t%prime[j]== ) cnt[i]++; //是因子
  35. while( t%prime[j]== ) t/=prime[j]; //去掉该因子
  36. }
  37. }
  38.  
  39. for(int i=; i<N; i++)
  40. {
  41. for(int j=; j<; j++) fval[i][j]=fval[i-][j];
  42. fval[i][cnt[i]]++;
  43. }
  44.  
  45. }
  46.  
  47. vector<int> val;
  48. int cal(int L,int R)//处理询问
  49. {
  50. val.clear();
  51. for(int i=; i>; i--)
  52. {
  53. if( fval[R][i]-fval[L-][i]> )
  54. {
  55. val.push_back(i);
  56. val.push_back(i);
  57. }
  58. else if( fval[R][i]-fval[L-][i]== )
  59. val.push_back(i);
  60. }
  61. int ans=;
  62. for(int i=; i<val.size(); i++)
  63. {
  64. for(int j=i+; j<val.size(); j++)
  65. ans=max(ans,__gcd(val[i],val[j]));
  66. }
  67. return ans;
  68. }
  69. int main()
  70. {
  71. freopen("input.txt", "r", stdin);
  72. pre_cal();
  73. int t, L, R;
  74. cin>>t;
  75. while(t--)
  76. {
  77. scanf("%d%d",&L,&R);
  78. printf("%d\n",cal(L,R));
  79. }
  80. return ;
  81. }

AC代码

HDU 5317 RGCDQ (质数筛法,序列)的更多相关文章

  1. hdu 5317 RGCDQ(前缀和)

    题目链接:hdu 5317 这题看数据量就知道需要先预处理,然后对每个询问都需要在 O(logn) 以下的复杂度求出,由数学规律可以推出 1 <= F(x) <= 7,所以对每组(L, R ...

  2. HDU 5317 RGCDQ (数论素筛)

    RGCDQ Time Limit: 3000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status ...

  3. HDU 5317 RGCDQ(素数个数 多校2015啊)

    题目链接:pid=5317" target="_blank">http://acm.hdu.edu.cn/showproblem.php?pid=5317 Prob ...

  4. hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317 题意:F(x) 表示x的不同质因子的个数结果是求L,R区间中最大的gcd( F(i) , F(j ...

  5. ACM学习历程—HDU 5317 RGCDQ (数论)

    Problem Description Mr. Hdu is interested in Greatest Common Divisor (GCD). He wants to find more an ...

  6. 2015 Multi-University Training Contest 3 hdu 5317 RGCDQ

    RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  7. HDU 5317 RGCDQ

    题意:f(i)表示i的质因子个数,给l和r,问在这一区间内f(i)之间任意两个数最大的最大公倍数是多少. 解法:先用筛法筛素数,在这个过程中计算f(i),因为f(i)不会超过7,所以用一个二维数组统计 ...

  8. 2015 HDU 多校联赛 5317 RGCDQ 筛法求解

    2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目  http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据 ...

  9. hdu 5317 合数分解+预处理

    RGCDQ Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

随机推荐

  1. POJ 2140

    #include<iostream> #include<stdio.h> using namespace std; int main() { int num; int i; i ...

  2. Bit-Map

    昨日读July大神<教你如何迅速秒杀掉:99%的海量数据处理面试题>博客,有这么一题与大家分享: 给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断 ...

  3. java cookie

    public static void AddCookie(HttpServletResponse response, String key, String value) { Cookie cookie ...

  4. MY_Log,无缝替换原生Log,支持日志输出到文件、FirePHP

    自己扩展了一个MY_Log, 用法类似于log4j,目前支持将日志输出到文件.FirePHP.如果你需要将日志输出到其他地方,比如邮件.数据库等,可以很方便地进行扩展. 用法很简单,大家一看就知道.1 ...

  5. POJ 3177 Redundant Paths(Tarjan)

    题目链接 题意 : 一个无向连通图,最少添加几条边使其成为一个边连通分量 . 思路 :先用Tarjan缩点,缩点之后的图一定是一棵树,边连通度为1.然后找到所有叶子节点,即度数为1的节点的个数leaf ...

  6. ssh超时断开的解决方法

    当用SSH Secure Shell连接Linux时,如果几分钟没有任何操作,连接就会断开,必须重新登陆才行,每次都重复相同的操作,很是烦人,本文总结了两种解决的方法. 方法1:更改ssh服务器的配置 ...

  7. lintcode:将二叉查找树转换成双链表

    题目 将一个二叉查找树按照中序遍历转换成双向链表 给定一个二叉查找树: 4 / \ 2 5 / \ 1 3 返回 1<->2<->3<->4<->5. ...

  8. hdu 3537 Daizhenyang's Coin (翻硬币游戏)

    #include<stdio.h> #include<algorithm> #include<string.h> using namespace std; ]; i ...

  9. vi / vim 删除以及翻页 其它命令

    vim中翻页的命令 vim中翻页的命令 整页翻页 ctrl-f ctrl-b f就是forword b就是backward 翻半页 ctrl-d ctlr-u d=down u=up 滚一行 ctrl ...

  10. 对所有CPU寄存器的简述(16位CPU14个,32位CPU16个)

    32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI)2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS.SS.DS.FS和GS)1 ...