#include #include #include #include #include #include using namespace std; typedef long long LL; typedef vector VI; #define REP(i,n) for(int i=0, i##_len=(n); i inline void amin(T &x, const T &y) { if (y inline void amax(T &x, const T &y) { if (x void rprintf(const char *fmt, Iter begin, Iter end) { for (bool sp=0; begin!=end; ++begin) { if (sp) putchar(' '); else sp = true; printf(fmt, *begin); } putchar('\n'); } template struct IRXQ { int n, g; T *d; IRXQ() : n(0), g(0), d(NULL) {} template IRXQ(Iter begin, Iter end) : n(0), g(0), d(0) { build(begin, end); } IRXQ(const IRXQ &y) : n(y.n), g(0), d(NULL) { if (y.n) build(y.d[0], y.d[0] + n); } IRXQ(IRXQ &&y) : n(0), g(0), d(NULL) { swap(*this, y); } ~IRXQ() { if (n) { n = 0; delete d; d = NULL; } } friend void swap(IRXQ &x, IRXQ &y) { swap(x.n, y.n); swap(x.d, y.d); } IRXQ& operator=(IRXQ y) { swap(*this, y); return *this; } template void build(Iter begin, Iter end) { // random access iterator n = end - begin; if (n == 0) return; g = __lg(n); d = new T[n*(g+1)]; REP (i, n) { d[i] = *begin; ++begin; } for (int t=0, b=0; t v: return i; // return n; int first_more_than(int l, const T v) const { for (int t=g+1; t--; ) if (l + (1< M(A, A+N); IRXQ S(sums, sums+N+1); REP (t, 16) { REP (i, N) { int s = i + (1< 0) { int pos = i; while (1) { int lo = pos+1, hi = N+1; ULL g = gcdx(i, lo); while (hi - lo > 1) { int mid = (lo + hi) / 2; if (gcdx(i, mid) == g) lo = mid; else hi = mid; } // [i, lo) // [pos, lo) int idx = S.max_i(pos+1, lo+1); int ma = M.max_v(i, idx); LL s = sums[idx] - sums[i]; amax(ans, (LL)g * (s - ma)); if (lo == N) break; pos = lo; } } printf("%lld\n", ans); } int main() { int TC = 1; // scanf("%d", &TC); REP (tc, TC) MAIN(); return 0; }