Codeforces Round #560 (Div. 3) D. Almost All Divisors

問題概要

ある数  x1 x 以外の全ての約数  d_1, \cdots, d_n が与えられます. このとき,  x を求めてください. 条件を満たす x が存在しない場合はその旨を報告してください. 

問題へのリンク

制約

  • 1 \le n \le 300
  •  2 \le d_i \le 10^6
  • すべての d_i は相違なる

解法

ある数  x の約数に  k があるとき,  x/k もまた  x の約数です. また,  k が( 1 以外の)最大の約数の時,  x/k は( x 以外の)最大の約数になります. 

よって, d をソートすれば,  d_1, d_n がそれぞれ最小, 最大の約数になってくれるので, この積が解の候補  x = d_1 \times d_2 =k \times (x/k) になってくれているわけです. 

あとは x が本当に条件を満たしているかどうかは x を実際に約数列挙してその集合が d と一致するかをみれば良いです. 

実装

約数集合が一致しているかは std::set を使うと楽です( k = x/k のような k をあらわに考える必要がないです).

Submission #145090216 - Codeforces