Official

B - Almost GCD Editorial by QCFium


まず、\(A_i\) の上限である \(1000\) より大きい数は GCD 度が \(0\) です。ところが \(2 \le A_i\) より \(A_1\) の GCD 度は少なくとも \(1\) なので \(1000\) より大きい数は考慮に入れる必要がないことが分かります。
すると、 \(2\) 以上 \(1000\) 以下のそれぞれの整数 \(k\) について GCD 度を計算してその中で GCD 度が最大だったときの \(k\) を出力すればよいことになります。
\(2\) 以上 \(1000\) 以下のそれぞれの整数 \(k\) について 」の処理や、ある整数の GCD 度の計算は繰り返し文を使うと実現できます。GCD 度が最大になるような \(k\) を求めるのは、今までの GCD 度の最大値と、そのときの \(k\) を持つ \(2\) つの変数を用意して、今の GCD 度が今までの GCD 度より大きかったらこの \(2\) つの変数を更新することでできます。

解答例 (C) ※C99 を仮定しています

#include <stdio.h>

int main() {
	int n;
	scanf("%d", &n);
	int a[n];
	for (int i = 0; i < n; i++) scanf("%d", &a[i]);
	
	int max = 0;
	int res = -1;
	for (int i = 2; i <= 1000; i++) {
		int cnt = 0;
		for (int j = 0; j < n; j++) if (a[j] % i == 0) cnt++;
		if (max < cnt) max = cnt, res = i;
	}
	printf("%d\n", res);
	return 0;
}

解答例 (Python)

N = int(input())
A = list(map(int, input().split()))
 
ans = -1
mx = 0
 
for x in range(2, 1001):
	s = sum(a % x == 0 for a in A)
	if mx < s:
		mx = s
		ans = x
 
print(ans)

posted:
last update: