erzhan's blog

By erzhan, 9 years ago, In Russian

Всем привет! Сегодня дорешивал задачу MagicalGCD (http://mirror.codeforces.com/group/qMxWCRoFe6/contest/100299/attachments). Так как на компьютере не было софта, решал на ideone.com и писал код на C, хотя сам я пишу на С++. Написал решение, отправляю и wrong answer на втором тесте, после нескольких оптимизаций и исправлений понял что компилятор не тот, код на C отправлял на компиляторе C++. Отправил первое решение, вау, прошло. На уроках по программированию мне говорили что код написанный на C, будет совместим с компиляторами C++. Кто может объяснить почему компилирование на C++, дает другой результат.

Вот код:


#include <stdio.h> #define N 500000 long long d[20][N + 1]; int t[N + 1]; int i, j, test, n, K; long long ans; int is(int i) { int m = 0; while ((1 << m) < i) m++; return 1 * ((1 << m) &mdash; i == 0); } 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 &mdash; l + 1]; return gcd(d[k][l], d[k][r &mdash; (1 << k) + 1]); } int lower(int l, int r, int R, long long cur) { int res; while (r &mdash; l >= 0) { int m = (l + r) / 2; if (GCD(m, R) == cur) { res = m; r = m &mdash; 1; } else { l = m + 1; } } return res; } int upper(int l, int r, int L, long long cur) { int res; while (r &mdash; l >= 0) { int m = (l + r) / 2; if (GCD(L, m) == cur) { res = m; l = m + 1; } else { r = m &mdash; 1; } } return res; } int main(void) { // your code goes here scanf("%I64d", &test); for (i = 2; i < N; i++) t[i] = t[i - 1] + is(i); while (test--) { scanf("%I64d", &n); ans = 0; for (i = 1; i <= n; i++) { scanf("%I64d", &d[0][i]); ans = max(ans, d[0][i]); } K = 2; while ((1 << K) < n) K++; for (i = 1; i <= K; i++) for (j = 1; j <= n - (1 << i) + 1; j++) d[i][j] = gcd(d[i - 1][j], d[i - 1][j + (1 << (i - 1))]); for (i = 1; i < n; i++) { int l = lower(1, i, i + 1, GCD(i, i + 1)); int r = upper(i, n, i, GCD(i, i + 1)); ans = max(ans, GCD(l, r) * (r - l + 1)); } printf("%I64d\n", ans); } return 0; }
  • Vote: I like it
  • 0
  • Vote: I do not like it