結果
問題 |
No.14 最小公倍数ソート
|
ユーザー |
![]() |
提出日時 | 2025-09-08 10:19:27 |
言語 | Crystal (1.14.0) |
結果 |
RE
|
実行時間 | - |
コード長 | 838 bytes |
コンパイル時間 | 13,023 ms |
コンパイル使用メモリ | 311,172 KB |
実行使用メモリ | 7,720 KB |
最終ジャッジ日時 | 2025-09-08 10:19:44 |
合計ジャッジ時間 | 14,377 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | RE * 20 |
ソースコード
M = 10000 n = gets.not_nil!.to_i a = Array.new(n) { |i| gets.not_nil!.to_i } cnt = Array.new(M + 1, 0) (1...n).each { |i| cnt[a[i]] += 1 } divs = Array(Array(Int32)).new(M + 1) { [1] } (2..M).each do |i| (i..M).step(i) do |j| divs[j] << i end end (1..M).each { |i| divs[i].reverse! } s = Array(Set(Int32)).new(M + 1) { Set(Int32).new } (1..M).each do |i| if cnt[i] != 0 divs[i].each { |d| s[d].add(i) } end end now = a[0] print "#{now} " until s[1].empty? lcm = 1_000_000_000 t = 1_000_000_000 divs[now].each do |d| next if s[d].empty? v = s[d].first candidate = v * now // d if lcm >= candidate lcm = candidate t = Math.min(t, v) end end break if t == 1_000_000_000 now = t cnt[t].times { print "#{t} " } cnt[t] = 0 divs[t].each { |d| s[d].delete(t) } end puts