結果
| 問題 | No.2480 Sequence Sum |
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2025-05-03 22:22:56 |
| 言語 | Go (1.23.4) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 500 ms |
| コード長 | 1,816 bytes |
| コンパイル時間 | 14,325 ms |
| コンパイル使用メモリ | 256,728 KB |
| 実行使用メモリ | 6,272 KB |
| 最終ジャッジ日時 | 2025-05-03 22:23:11 |
| 合計ジャッジ時間 | 12,799 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 13 |
ソースコード
package main
import . "fmt"
func main() {
var n int
Scan(&n)
Println(solve(n))
}
func solve(n int) int {
// 隣り合う整数 X X+1
// XがC個、X+1がD個 (C >= 1 && D >= 1)
// LEN = C + D (LEN > D && LEN > C)
// N = X*C+(X+1)*D = X*(C+D) + D = X*LEN + D
// うーん、N-D=X*LEN
// (N - D) / X = LEN
// N = X*LEN1 + D1
// LEN2 = LEN1 - 1
// N = X*LEN2 + D2
// N = X*(LEN1-1) + (D1+X)
// N = X*(LEN - Ki) + (D + Ki * X)
// LEN - Ki > D + Ki * X
// LEN > D + Ki * (X + 1)
// N % X == 0 のとき LEN = N / X のみ
// N % X != 0 のとき (LEN - Ki) = (N - (D + Ki * X)) / X
// LEN = (N - D) / X - Ki * (X + 1)
// N = X * LEN + D + Ki * X * (X + 1)
// LEN - Ki つまり任意サイズとれる?
// (N - D) / X > Ki * (X + 1)
// (N - D) / X / (X + 1) > Ki
// LEN / (X + 1) > Ki
// D = N % X ?これはDの最小?
// 0 <= D < X ?
// X + (X + 1) <= N より X <= (N - 1) / 2
// さすがに全探索は無理そう(N=1e9のときなど)
// ------------------
// LEN=2 のとき [X, X+1]
// LEN=3 のとき [X, X, X+1] ... [X, X+1, X+1] (sumdiff 0 ... 1) (sum 3X+1 ... 3X+2)
// LEN=4 のとき [X,X,X,X+1] ... [X,X+1,X+1,X+1] (sumdiff 0 ... 2) (sum 4X+1 ... 4X+3)
// LEN=5 のとき [X,X,X,X,X+1] ... [X,X+1,X+1,X+1,X+1] (sumdiff 0 ... 3) (sum 5X+1 ... 5X+4)
// LEN=6 のとき [X,..,X,X+1] ... [X,X+1,...,X+1] (sumdiff 0 ... 4) (sum 6X+1 ... 6X+5)
// 長さに対してXは一意に決まるぽい?
// さらに言うなら、Nの約数のLENにはならないぽい?
// つまり、Nと互いに素なN未満の数の総数?
m := map[int]bool{}
for x := 1; x * x <= n; x++ {
if n % x == 0 {
m[x] = true
m[n/x] = true
}
}
return n-len(m)
}
ID 21712