// * // * // * Created By : Pritish Thakkar // * Hackerrank : ma5terdrag0n // * CodeChef : solo_loser // * Hackerearth : pritish9 // *------------------------------------ // * OS : Ubuntu 16.04 // * Language : CPP14 // * Editor : Sublime Text 3 // * C++ compiler : g++ // * // * #include #define pb push_back #define mp make_pair #define inf 1000000007 #define fr first #define sc second #define eps 1e-9 #define clr(a) memset(a, 0, sizeof(a)) #define sz(x) x.size() #define sni(x) scanf("%d",&x) #define snl(x) scanf("%lld", &x) #define snc(x) scanf("%c", &c); #define rep(n) for(int i = 0 ; i < n ;i ++) #define repc(i, n) for(int i = 0 ; i < n ; i ++) #define FOR(i, x, y) for(int i = x ; i < y ; i ++) #define DEC(i, x, y) for(int i = x ; i >= y ; i --) #define all(v) v.begin(), v.end() #define min3(a, b, c) min(a, min(b,c)) #define max3(a, b, c) max(a, max(b, c)) #define alla(a, n) a, a+n using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair ii; typedef vector vi; typedef vector vii; bool isUpper(char c) {return (c >= 'A' && c <= 'Z');} bool isLower(char c) {return (c >= 'a' && c <= 'z');} bool iplpha(char c) {return (c >= 'A' && c <= 'Z')||(c >= 'a' && c <= 'z');} bool isnum(char c){return (c >= '0' and c <= '9');} bool isalnum(char c) {return (c >= 'A' && c <= 'Z')||(c >= 'a' && c <= 'z')||(c >= '0' && c <= '9');} char toUpper(char c){return isUpper(c)?c:c-'a'+'A';} char toLower(char c){return isLower(c)?c:c+'a'-'A';} bool isvowel(char c){c = toLower(c); return (c == 'a' or c == 'e' or c == 'i' or c == 'i' or c == 'o' or c == 'u');} template t gcd(t a, t b){return ((b == 0) ? a : gcd(b, a%b));} template t lcm(t a, t b){return (a * (b / gcd(a, b)));} template T modpow(T base, T exp, T modulus) {base %= modulus;T result = 1;while (exp > 0) {if (exp & 1) result = (result * base) % modulus;base = (base * base) % modulus;exp >>= 1;}return result;} string toLowerCase(string s){rep(s.size()){if(!isLower(s[i])){s[i] = toLower(s[i]);}}return s;} string toUpperCase(string s){rep(s.size()){s[i] = toUpper(s[i]);}return s;} template void cumulative(T *a, T *b, T n){rep(n){i ? b[i] = b[i-1] + a[i] : b[i] = a[i];}} bool ispal(string s){ll lo, hi;lo = 0;hi = s.length()-1;while(lo <= hi){if(s[lo] != s[hi]){return 0;}lo++;--hi;}return 1;} templatestring toString(T n){string v = "";while(n){v.pb(n % 10 + '0');n /= 10;}reverse(all(v));return v;} template void fs(T &number){bool negative = false;register int c;number = 0;c = getchar();if (c=='-'){negative = true;c = getchar();}for (; (c>47 && c<58); c=getchar())number = number *10 + c - 48;if (negative)number *= -1;} double areaOfTriangle(double ax, double ay, double bx, double by, double cx, double cy){ double ans = 1.00 * fabs(ax * (by - cy) + bx * (cy - ay) + cx * (ay - by))/2.00; return ans; } //---------------------------- // ll fact[100001], rfact[100001]; // void preprocess(){ // ll mod = inf; // fact[0] = fact[1] = rfact[0] = rfact[1] = 1; // for(int i = 2 ; i <= 100000 ; i ++){ // fact[i] = (fact[i-1]*i) % mod; // rfact[i] = modpow(fact[i], mod-2, mod); // } // } // void solve(){ // preprocess(); // string s; // ll q; // cin >> s >> q; // while(q--){ // ll lo, hi; // cin >> lo >> hi; // lo --; // hi --; // ll a[26] = {0}; // for(int i = lo ;i <= hi ;i++){ // a[s[i]-'a']++; // } // vi even; // ll odd = 0; // ll len = 0; // rep(26){ // if(a[i] && !(a[i] & 1)){even.pb(a[i]/2);len+=a[i]/2;} // else if(a[i] && (a[i]&1))odd++; // } // if(odd == 0)odd=1; // ll ans = odd; // ll mod = inf; // ll sum = 0; // rep(sz(even)){ // ans = (ans * rfact[even[i]]) % mod; // sum += even[i]; // } // ans = (ans * fact[sum]) % mod; // if(ans < 0)ans+=mod; // cout << ans << endl; // } // } ll gg[1001][1001], sum[1001][1001], maxi[1001][1001], dp[1000][1000]; void solve(){ ll n; cin >> n; ll a[n]; rep(n){ cin >> a[i]; gg[i][i] = sum[i][i] = maxi[i][i] = a[i]; } rep(n-1){ gg[i][i+1] = gcd(gg[i][i], a[i+1]); maxi[i][i+1] = max(maxi[i][i], a[i+1]); sum[i][i+1] = sum[i][i] + a[i+1]; } for(int len = 3; len <= n ;len++){ for(int i = 0 ; i + len -1 < n ; i ++){ ll j = i + len - 1; gg[i][j] = gcd(gg[i+1][j-1], gcd(a[i], a[j])); sum[i][j] = a[i] + a[j] + sum[i+1][j-1]; maxi[i][j] = max3(maxi[i+1][j-1], a[i], a[j]); } } ll ans = 0; for(int len = 1; len <= n ;len++){ for(int i = 0 ; i + len -1 < n ; i ++){ ll j = i + len - 1; dp[i][j] = gg[i][j] * (sum[i][j] - maxi[i][j]); ans = max(ans, dp[i][j]); } } cout << ans << endl; } int main(){ std::ios::sync_with_stdio(0); int start = clock(); #ifdef ONLINE_JUDGE #else // freopen("input.in" , "r" , stdin); // freopen("output.txt", "w", stdout); #endif solve(); int stop = clock(); #ifdef ONLINE_JUDGE #else // cout << setprecision(6) << fixed << (stop - start) * 1000.00 / double(CLOCKS_PER_SEC)<< endl; #endif }