結果
| 問題 |
No.368 LCM of K-products
|
| コンテスト | |
| ユーザー |
sgsw
|
| 提出日時 | 2021-08-17 22:31:09 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 388 ms / 2,000 ms |
| コード長 | 1,670 bytes |
| コンパイル時間 | 11,063 ms |
| コンパイル使用メモリ | 225,248 KB |
| 実行使用メモリ | 5,888 KB |
| 最終ジャッジ日時 | 2024-10-10 22:43:09 |
| 合計ジャッジ時間 | 15,668 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 35 |
ソースコード
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strconv"
)
var wg = bufio.NewScanner(os.Stdin)
const (
inf = int(1e18)
initialBufSize = int(1e6)
maxBufSize = int(1e6)
mod = int(1e9 + 7)
)
var buf []byte = make([]byte, initialBufSize)
func factorize(n int) map[int]int {
div := n
retval := make(map[int]int)
for i := 2; i*i <= n; i++ {
if div%i == 0 {
ord := 0
for div%i == 0 {
div /= i
ord++
}
retval[i] = ord
}
}
if div > 1 {
retval[div] = 1
}
return retval
}
func main() {
n, k := nextInt(), nextInt()
a := make([]int, n)
for i := 0; i < n; i++ {
a[i] = nextInt()
}
fact_a := make([]map[int]int, n)
prime_set := make(map[int]bool)
for i := 0; i < n; i++ {
fact_a[i] = factorize(a[i])
for key := range fact_a[i] {
prime_set[key] = true
}
}
ans := 1
for p := range prime_set {
b := make([]int, n)
for i := 0; i < n; i++ {
if val, ok := fact_a[i][p]; ok {
b[i] = val
}
}
sort.Slice(b, func(i, j int) bool {
return b[i] > b[j]
})
ord := 0
for i := 0; i < k; i++ {
ord += b[i]
}
ans = ans * powMod(p, ord, mod) % mod
}
fmt.Printf("%d\n", ans)
}
// greatest common divisor (GCD) via Euclidean algorithm
func GCD(a, b int) int {
for b != 0 {
t := b
b = a % b
a = t
}
return a
}
func powMod(x, n, mod int) int {
retval := 1
for mul := x; n > 0; {
if n&1 == 1 {
retval = retval * mul % mod
}
mul = mul * mul % mod
n >>= 1
}
return retval
}
func init() {
wg.Split(bufio.ScanWords)
wg.Buffer(buf, maxBufSize)
}
func nextInt() int {
wg.Scan()
i, e := strconv.Atoi(wg.Text())
if e != nil {
panic(e)
}
return i
}
sgsw