[白準C+]1037薬水


質問する


正数AをNの真約数にするには,NはAの倍数であり,Aは1とNではない.任意の数Nのすべての真約数が与えられた場合、Nを求めるプログラムを作成してください.

入力


第1行はNの真約数の個数を与える.この数は50以下の自然数です.2行目はNの真約数を与える.10,000,000以下、2以上の自然数は、繰り返しません.

しゅつりょく


1行目にNを出力します.Nは常に32ビットの整数で表すことができる.
https://www.acmicpc.net/problem/1037

に答える


重要なのは、最大100万回入力することです.
C/C++ではint型配列の最大サイズは10万程度である.
したがって,すべての値を配列に格納するには,最初から非効率なアクセスであり,約数の特性を利用すればよい.
すべての薬をあげるので、
約数に両端を乗じた値、すなわちNです.
例えば、n=16の場合
2、4、8の約数のうち
2 x 8 = 16
4 x 4=16.
簡単に言えば、入力値の中で最も高い値、最も高い値を見つけて、それから互いに乗じて、Nになりました.
#define _CRT_SECURE_NO_WARNINGS 
#include <bits/stdc++.h>

int main(void) {
	int T, min=0x7fffffff, max = 0;
	scanf("%d", &T);
	if (T == 1) {
		int temp=0;
		scanf("%d", &temp);
		printf("%d", temp * temp);
	}else{
		while (T--) {
			int temp;
			scanf("%d", &temp);
			if (min > temp)
				min = temp;
			if (max < temp)
				max = temp;
		}
		printf("%d", min * max);
	}
	return 0;
}
ここで、0 x 7 fffffffはintの最値を16進数と表記する