[关闭]
@tenlee 2015-07-28T11:42:26.000000Z 字数 1383 阅读 1544

HDU 5317 RGCDQ(2015多校联合)

HDUOJ


题目链接:戳我

题目大意

函数 F(x) = x 的素因子个数,给定一个区间 L,R 求 max(GCD(F(i),F(j))
其中(L<=i<j<=R),即区间内任意两个不相等的两个数的最大公约数的 最大值
数据范围 2<=L<R<=1000000

样例解释

2 // T
2 3 //L=2, R=3,f(2)=1, f(3)=1,故答案为 1

解题思路

因为R最大为106,且2357111317=510510<106<235711131719
所以一定存在 f(x)<8,(2<=x<=106)
f(x)很容易 求得
故只需要知道L R区间内有多少个 1,2...7 即可
可以 用s[i][j]保存前i个F中j的个数

代码

  1. //Author LJH
  2. //www.cnblogs.com/tenlee
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <cctype>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <vector>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #define clc(a, b) memset(a, b, sizeof(a))
  14. using namespace std;
  15. const int inf = 0x3f;
  16. const int INF = 0x3f3f3f3f;
  17. const int maxn = 1e6+5;
  18. int nu[maxn], s[maxn][10], ha[10];
  19. void Init()
  20. {
  21. clc(nu, 0);
  22. clc(s, 0);
  23. for(int i = 2; i < maxn; i++)
  24. {
  25. if(nu[i]) continue;
  26. nu[i] = 1;
  27. for(int j = 2; j * i < maxn; j++)
  28. {
  29. nu[j*i]++;
  30. }
  31. }
  32. s[2][1] = 1;
  33. for(int i = 3; i < maxn; i++)
  34. {
  35. for(int j = 1; j <= 7; j++)
  36. {
  37. s[i][j] = s[i-1][j];
  38. }
  39. s[i][nu[i]]++;
  40. }
  41. }
  42. int GCD(int x, int y)
  43. {
  44. return y == 0 ? x : GCD(y, x%y);
  45. }
  46. int main()
  47. {
  48. int l, r, T, k;
  49. int nlr[10], a[20];
  50. Init();
  51. scanf("%d", &T);
  52. while(T--)
  53. {
  54. scanf("%d %d", &l, &r);
  55. k = 0;
  56. for(int i = 1; i <= 7; i++)
  57. {
  58. nlr[i] = s[r][i] - s[l][i];
  59. if(i == nu[l] ) nlr[i]++;
  60. //printf("i = %d, %d\n", i, nlr[i]);
  61. if(nlr[i] >= 2)
  62. {
  63. a[k++] = i; a[k++] = i;
  64. }
  65. else if(nlr[i] == 1)a[k++] = i;
  66. }
  67. int ma = 1;
  68. for(int i = 0; i < k-1; i++)
  69. {
  70. for(int j = i+1; j < k; j++)
  71. {
  72. ma = max(GCD(a[i], a[j]), ma);
  73. }
  74. }
  75. printf("%d\n", ma);
  76. }
  77. return 0;
  78. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注