AtCoder Beginner Contest 125 C問題
2019-04-29

C - GCD on Blackboard

コンテスト中は手も足も出なかったが、以下の非常にわかりやすい説明を受けて何とか実装できた。


#include <bits/stdc++.h>
using namespace std;

int gcd(int a,int b){ if(a<b) gcd(b,a); while(a%b){ int r=a%b; a=b;b=r; } return b; }

int main() {

int N; cin >> N; vector<int> A(N); for (int i=0; i<N; i++){ cin >> A.at(i); }

vector<int> pre(N); //累積GCD(前から) vector<int> suf(N); //累積GCD(後から) pre.at(0) = A.at(0); suf.at(N-1) = A.at(N-1); for (int i=1; i<N; i++){ pre.at(i) = gcd(pre.at(i-1), A.at(i)); } for (int i = N-2; i>=0; i--){ suf.at(i) = gcd(suf.at(i+1), A.at(i)); }

int ans = suf.at(1); // 2番目以降の累積GCD

for (int i=1; i<N-1; i++){ ans = max(ans, gcd(pre.at(i-1), suf.at(i+1))); } ans = max(ans, pre.at(N-2)); // 一番後ろ以外の累積GCD

cout << ans << endl; }

twitter: @hukurouo < thank you !