Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- long long d[18][100100];
- int t[100100];
- int i, j, test, n, K;
- long long ans;
- int is(int x) {
- while (x > 1) {
- if (x & 1)
- return 0;
- x >>= 1;
- }
- return 1;
- }
- long long max(long long a, long long b) {
- if (a > b)
- return a;
- return b;
- }
- long long gcd(long long a, long long b) {
- while (a && b) {
- if (a < b) {
- long long d = a;
- a = b;
- b = d;
- }
- a = a % b;
- }
- return a + b;
- }
- long long GCD(int l, int r) {
- int k = t[r - l + 1];
- return gcd(d[k][l], d[k][r - (1 << k) + 1]);
- }
- int lower(int l, int r, int R, long long cur) {
- int res;
- while (r - l >= 0) {
- int m = (l + r) / 2;
- if (GCD(m, R) == cur) {
- res = m;
- r = m - 1;
- } else {
- l = m + 1;
- }
- }
- return res;
- }
- int upper(int l, int r, int L, long long cur) {
- int res;
- while (r - l >= 0) {
- int m = (l + r) / 2;
- if (GCD(L, m) == cur) {
- res = m;
- l = m + 1;
- } else {
- r = m - 1;
- }
- }
- return res;
- }
- int main(void) {
- // your code goes here
- scanf("%d", &test);
- for (i = 2; i <= 100000; i++)
- t[i] = t[i - 1] + is(i);
- while (test--) {
- scanf("%d", &n);
- for (i = 0; i < n; i++) {
- scanf("%I64d", &d[0][i]);
- ans = max(ans, d[0][i]);
- }
- K = t[n];
- for (i = 1; i <= K; i++)
- for (j = 0; j < n - (1 << i) + 1; j++)
- d[i][j] = gcd(d[i - 1][j], d[i - 1][j + (1 << (i - 1))]);
- for (i = 0; i < n - 1; i++) {
- int l = lower(0, i, i + 1, gcd(d[0][i], d[0][i + 1]));
- int r = upper(i, n - 1, i, gcd(d[0][i], d[0][i + 1]));
- ans = max(ans, GCD(l, r) * (r - l + 1));
- }
- printf("%I64d\n", ans);
- ans = 0;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment