Guest User

Untitled

a guest
Oct 14th, 2015
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.03 KB | None | 0 0
  1. #include <stdio.h>
  2.  
  3.  
  4. long long d[18][100100];
  5. int t[100100];
  6. int i, j, test, n, K;
  7. long long ans;
  8.  
  9. int is(int x) {
  10.     while (x > 1) {
  11.         if (x & 1)
  12.             return 0;
  13.         x >>= 1;
  14.     }
  15.     return 1;
  16. }
  17.  
  18. long long max(long long a, long long b) {
  19.     if (a > b)
  20.         return a;
  21.     return b;
  22. }
  23.  
  24. long long gcd(long long a, long long b) {
  25.     while (a && b) {
  26.         if (a < b) {
  27.             long long d = a;
  28.             a = b;
  29.             b = d;
  30.         }
  31.         a = a % b;
  32.     }
  33.     return a + b;
  34. }
  35.  
  36. long long GCD(int l, int r) {
  37.     int k = t[r - l + 1];
  38.     return gcd(d[k][l], d[k][r - (1 << k) + 1]);
  39. }
  40.  
  41. int lower(int l, int r, int R, long long cur) {
  42.     int res;
  43.     while (r - l >= 0) {
  44.         int m = (l + r) / 2;
  45.         if (GCD(m, R) == cur) {
  46.             res = m;
  47.             r = m - 1;
  48.         } else {
  49.             l = m + 1;
  50.         }
  51.     }
  52.     return res;
  53. }
  54.  
  55. int upper(int l, int r, int L, long long cur) {
  56.     int res;
  57.     while (r - l >= 0) {
  58.         int m = (l + r) / 2;
  59.         if (GCD(L, m) == cur) {
  60.             res = m;
  61.             l = m + 1;
  62.         } else {
  63.             r = m - 1;
  64.         }
  65.     }
  66.     return res;
  67. }
  68.  
  69. int main(void) {
  70.     // your code goes here
  71.    
  72.     scanf("%d", &test);
  73.    
  74.     for (i = 2; i <= 100000; i++)
  75.         t[i] = t[i - 1] + is(i);
  76.    
  77.     while (test--) {
  78.         scanf("%d", &n);
  79.         for (i = 0; i < n; i++) {
  80.             scanf("%I64d", &d[0][i]);
  81.             ans = max(ans, d[0][i]);
  82.         }
  83.        
  84.         K = t[n];
  85.        
  86.         for (i = 1; i <= K; i++)
  87.             for (j = 0; j < n - (1 << i) + 1; j++)
  88.                 d[i][j] = gcd(d[i - 1][j], d[i - 1][j + (1 << (i - 1))]);
  89.        
  90.         for (i = 0; i < n - 1; i++) {
  91.             int l = lower(0, i, i + 1, gcd(d[0][i], d[0][i + 1]));
  92.             int r = upper(i, n - 1, i, gcd(d[0][i], d[0][i + 1]));
  93.             ans = max(ans, GCD(l, r) * (r - l + 1));
  94.         }
  95.         printf("%I64d\n", ans);
  96.         ans = 0;
  97.     }
  98.  
  99.     return 0;
  100. }
Advertisement
Add Comment
Please, Sign In to add comment