λ°±μ€ 21870
λ¬Έμ
νμ΄
μΌμͺ½μμ λΆν° μ νν κ²½μ° μ νν μ μλ μμμ κ°μλ ⌊|S|/2⌋, μ€λ₯Έμͺ½λΆν° μ νν κ²½μ° μ νν μ μλ μμμ κ°μλ ⌈|S|/2⌉λ‘ μ ν΄μ Έ μλ€.
ν λ°©ν₯μ μ ννκ² λλ€λ©΄ ν΄λΉ λ°©ν₯μ μμ μ 체μ GCDλ₯Ό μ ννκ³ λ¨μ μμλ€μμ λ€μ λ°©ν₯μ μ ννλ νμ€ν¬λ₯Ό μ§ννκ² λλ€.
κ·Έλ¬λ―λ‘ μΌμͺ½μ μ ννλ κ²½μ°, μ€λ₯Έμͺ½μ μ ννλ κ²½μ°μ λν λͺ¨λ κ²½μ°μ μλ₯Ό κ΅¬ν΄ μ΅λκ°μ ꡬνλ©΄ ν리λ λ¬Έμ λ€.
λ°°μ΄μ ν¬κΈ°λ 2*10^5μ΄κ³ , a<=2*10^5, b<=2*10^5λΌ νμλ gcd(a, b)μ μκ°λ³΅μ‘λλ log min(a, b)κ° λλ€.
κ·Έλ¬λ―λ‘ μ 체 λ°°μ΄μ λν΄ gcd μ°μ°μ νκ² λλ μ΄ μκ³ λ¦¬μ¦μ O(N log min(a, b))μ΄λ€.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, arr[200001], ans;
int gcd(int a, int b) {
if(b == 0) return a;
return gcd(b, a%b);
}
int getGcd(int l, int r) {
int g = arr[l];
for(int i=l+1; i<=r; i++) {
g = gcd(g, arr[i]);
}
return g;
}
int solve(int l, int r, int n) {
if(n == 1) return max(arr[l], arr[r]);
int arrsize = n/2;
int right = getGcd(l, l+arrsize-1) + solve(l+arrsize, r, n-arrsize);
int left = getGcd(l+arrsize, r) + solve(l,l+arrsize-1, arrsize);
return max(left, right);
}
int main() {
cin>>N;
for(int i=0; i<N; i++) {
cin>>arr[i];
}
cout<<solve(0, N-1, N);
}