結果
| 問題 |
No.2358 xy+yz+zx=N
|
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 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)
}
}
ID 21712