fork(1) download
  1. #include <iostream>
  2. #include <complex>
  3. #include <cstdlib>
  4.  
  5. using namespace std;
  6.  
  7. int D[500100];
  8. int FF[500100];
  9.  
  10. typedef complex<double> base;
  11.  
  12. int rev[1100000];
  13. base wlen_pw[1100000];
  14. long double PI = 3.14159265354;
  15. int n = 1048576;
  16. base fa[1048576];
  17. base fb[1048576];
  18.  
  19. void fft (base a[], bool invert) {
  20. for (int i=0; i<n; ++i)
  21. if (i < rev[i])
  22. swap (a[i], a[rev[i]]);
  23.  
  24. for (int len=2; len<=n; len<<=1) {
  25. double ang = 2*PI/len * (invert?-1:+1);
  26. int len2 = len>>1;
  27.  
  28. base wlen (cos(ang), sin(ang));
  29. wlen_pw[0] = base (1, 0);
  30. for (int i=1; i<len2; ++i)
  31. wlen_pw[i] = wlen_pw[i-1] * wlen;
  32.  
  33. for (int i=0; i<n; i+=len) {
  34. base t,
  35. *pu = a+i,
  36. *pv = a+i+len2,
  37. *pu_end = a+i+len2,
  38. *pw = wlen_pw;
  39. for (; pu!=pu_end; ++pu, ++pv, ++pw) {
  40. t = *pv * *pw;
  41. *pv = *pu - t;
  42. *pu += t;
  43. }
  44. }
  45. }
  46.  
  47. if (invert)
  48. for (int i=0; i<n; ++i)
  49. a[i] /= n;
  50. }
  51.  
  52. void calc_rev () {
  53. for (int i=0; i<n; ++i) {
  54. rev[i] = 0;
  55. for (int j=0; j<20; ++j)
  56. if (i & (1<<j))
  57. rev[i] |= 1<<(19-j);
  58. }
  59. }
  60.  
  61. void multiply () {
  62.  
  63. for (int i=0;i<500001;i++)
  64. fa[i] = D[i];
  65. for (int i=0;i<500001;i++)
  66. fb[i] = D[i];
  67.  
  68. fft (fa, false);
  69. fft (fb, false);
  70. for (size_t i=0; i<n; ++i)
  71. fa[i] *= fb[i];
  72. fft (fa, true);
  73.  
  74.  
  75. for (size_t i=0; i<500001; ++i)
  76. FF[i] = int (fa[i].real() + 0.5);
  77. }
  78.  
  79.  
  80. int main(){
  81. D[1] = 1;
  82. for (int i=2;i<=500000;i++)
  83. if (!D[i])
  84. for (int j=i+i;j<=500000;j+=i)
  85. D[j] = i;
  86.  
  87. for (int i=500000;i>=2;i--){
  88. int d = 1;
  89. int u = i;
  90. int b = D[u];
  91. int c = 0;
  92. while (D[u]){
  93. if (b == D[u])
  94. c++;
  95. else{
  96. d*=(c+1);
  97. c = 1;
  98. b = D[u];
  99. }
  100. u/=D[u];
  101. }
  102. if (u == b)
  103. d*=(c+2);
  104. else d*=(c+1)*2;
  105. D[i] = d;
  106. }
  107. calc_rev();
  108. multiply();
  109.  
  110.  
  111. int N;
  112. cin >> N;
  113. for (int i=0;i<N;i++){
  114. int l,r;
  115. cin >> l >> r;
  116. int aa = 0;
  117. int v = -1;
  118. for (int j=l;j<=r;j++)
  119. if (aa < FF[j]){
  120. aa = FF[j];
  121. v = j;
  122. }
  123. cout << v << " "<<aa<<endl;
  124. }
  125. }
Success #stdin #stdout 2.36s 61264KB
stdin
Standard input is empty
stdout
Standard output is empty