結果
問題 |
No.2480 Sequence Sum
|
ユーザー |
![]() |
提出日時 | 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) }