結果
| 問題 | 
                            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")
}