結果
問題 |
No.2358 xy+yz+zx=N
|
ユーザー |
![]() |
提出日時 | 2025-05-05 00:08:37 |
言語 | Go (1.23.4) |
結果 |
AC
|
実行時間 | 215 ms / 2,000 ms |
コード長 | 1,367 bytes |
コンパイル時間 | 11,858 ms |
コンパイル使用メモリ | 248,656 KB |
実行使用メモリ | 7,848 KB |
最終ジャッジ日時 | 2025-05-05 00:08:51 |
合計ジャッジ時間 | 13,602 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 10 |
ソースコード
package main import . "fmt" func main() { var n int Scan(&n) // // 1 <= N <= 1e7 // x * y + y * z + z * x = N // // y * (z + x) = N - x * z // x == 0 -> y * (z + 0) = N - 0 * z // x == 1 -> y * (z + 1) = N - 1 * z // x == 2 -> y * (z + 2) = N - 2 * z // x == 3 -> y * (z + 3) = N - 3 * z // // x == 0 の場合は 約数列挙で y * z の組は求まる // // x,y,z > 0 のとき x * y < N , y * z < N , z * x < N // 0 < x * x < N としたとき、上記制約により y * y < N または z * z < N // つまり、x * x < N かつ y * y < N としたとき x と y の組を全探索できる、 x と y の組に対して z 一意に定まる // t := map[string]bool{} key := func(i, j, k int) string { return Sprint(i," ", j, " ", k) } for y := 1; y * y <= n; y++ { if n % y != 0 { continue } t[key(0, y, n/y)] = true t[key(0, n/y, y)] = true t[key(y, 0, n/y)] = true t[key(n/y, 0, y)] = true t[key(y, n/y, 0)] = true t[key(n/y, y, 0)] = true } for x := 1; x * x < n; x++ { for y := 1; y * y < n; y++ { if (n-x*y) % (x+y) != 0 { continue } z := (n-x*y) / (x+y) t[key(x, y, z)] = true t[key(x, z, y)] = true t[key(y, x, z)] = true t[key(z, x, y)] = true t[key(y, z, x)] = true t[key(z, y, x)] = true } } Println(len(t)) for k, _ := range t { Println(k) } }