기본적으로 gcd는 값이 추가될수록 무조건 작아진다. 왜? 당연히! 당연히!
🤔 how to prove!
left를 고정해야 할 게 아니라 right를 고정하면 생각이 쉬워진다.
map<int, long long> prev, cur;
// prev는 index를 끝으로 하는 모든 범위에서 가지는 각 gcd의 개수
// cur은 중간에 prev가 갱신되면 loop가 제대로 동작이 안되기 때문에 있는 값
for(int i=0; i<N; ++i) {
cur.clear();
cur[arr[i]]++;
for(auto &p:prev) {
int g = gcd(p.first, arr[i]);
cur[g] += p.second;
}
}