문제

링크

풀이

#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
 
int gcd(int a, int b) {
  return b ? gcd(b, a % b) : a;
}
 
int calc(const vector<int> &a, int l, int r) {
  if (l == r) return a[l];
 
  int p = a[l];
  for (int i=l+1; i<=l+(r-l+1)/2-1; i++) p = gcd(p, a[i]);
  p += calc(a, r-(r-l)/2, r);
 
  int q = a[r-(r-l)/2];
  for (int i=r-(r-l)/2+1; i<=r; i++) q = gcd(q, a[i]);
  q += calc(a, l, l+(r-l+1)/2-1);
 
  return max(p, q);
}
 
void solve(void) {
  int n; cin >> n;
  vector<int> a(n);
  for (int i=0; i<n; i++) cin >> a[i];
 
  cout << calc(a, 0, n-1);
}
 
int main(void) {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
 
  solve();
  return 0;
}