結果
| 問題 | No.14 最小公倍数ソート |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-11-21 11:32:12 |
| 言語 | Go (1.23.4) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,489 bytes |
| コンパイル時間 | 10,369 ms |
| コンパイル使用メモリ | 238,288 KB |
| 実行使用メモリ | 15,252 KB |
| 最終ジャッジ日時 | 2024-10-10 20:11:34 |
| 合計ジャッジ時間 | 18,289 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 4 TLE * 1 -- * 15 |
ソースコード
package main
import (
"fmt"
"sort"
)
func prime() func() int {
var primes []int
i := 2
_isPrime := func(n int) bool {
for _, p := range primes {
if p > n*n {
break
}
if n%p == 0 {
return false
}
}
return true
}
return func() int {
for !_isPrime(i) {
i++
}
primes = append(primes, i)
return i
}
}
func primeFactorization(n int) (factor map[int]int) {
factor = make(map[int]int)
primes := prime()
for {
d := primes()
if d > n*n {
break
}
for n%d == 0 {
n /= d
factor[d]++
}
}
if n > 1 {
factor[n]++
}
return
}
func divisors(num int) []int {
primeFactors := primeFactorization(num)
var pNum int
for _, v := range primeFactors {
pNum *= v + 1
}
ret := make([]int, 0, pNum)
ret = append(ret, 1)
for p, k := range primeFactors {
for _, x := range ret {
for i := 0; i < k; i++ {
x *= p
ret = append(ret, x)
}
}
}
sort.Ints(ret)
return ret
}
var dp, m [10001]int
func main() {
var N int
fmt.Scan(&N)
A := make([]int, N)
for i := 0; i < N; i++ {
fmt.Scan(&A[i])
m[A[i]]++
}
next := A[0]
m[next]--
fmt.Print(next)
for i := 0; i < N-1; i++ {
divisor := divisors(next)
check := 99999
ans := 0
for _, d := range divisor {
for d*dp[d] <= 10000 {
if m[d*dp[d]] > 0 {
if check <= dp[d] {
break
}
ans = d * dp[d]
check = dp[d]
} else {
dp[d]++
}
}
}
next = ans
m[next]--
fmt.Print(" ", next)
}
fmt.Print("\n")
}