結果
| 問題 | No.1664 Unstable f(n) |
| コンテスト | |
| ユーザー |
ID 21712
|
| 提出日時 | 2026-05-10 18:58:06 |
| 言語 | Go (1.26.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,822 bytes |
| 記録 | |
| コンパイル時間 | 15,641 ms |
| コンパイル使用メモリ | 281,168 KB |
| 実行使用メモリ | 6,400 KB |
| 最終ジャッジ日時 | 2026-05-10 18:58:26 |
| 合計ジャッジ時間 | 15,329 ms |
|
ジャッジサーバーID (参考情報) |
judge2_1 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 35 WA * 3 |
ソースコード
package main
import . "fmt"
import . "math"
func xrt(a, x int) int {
p := max(2, int(Ceil(Pow(float64(a),1/float64(x)))))
for {
pp := a
for i := 0; i < x; i++ {
pp /= p
}
if pp > p {
p++
} else {
break
}
}
for {
pp := a
for i := 0; i < x; i++ {
pp /= p
}
if pp == 0 {
p--
} else {
break
}
}
return p
}
func main() {
var n int
Scan(&n)
ans := n+1
for j := 2; j <= 63; j++ {
i := xrt(n, j)
ij := 1
for a := 0; a < j; a++ {
ij *= i
}
k := n-ij
ans = min(ans, i+j+k)
println("i=",i,",j=",j,",k=",k,",ij=",ij)
}
Println(ans)
}
/*
考察
n = i^j + k
iを固定したとき
i^jのときの k と
i^(j-1)のときの k' を
比較すると
k = n - i^j
k' = n - i^(j-1)
k' - k = n - i^(j-1) - (n - i^j)
= i^j - i^(j-1)
= i^(j-1) * (i-1)
k' = k + i^(j-1) * (i-1)
これはかなり大きな値なので
iを固定したとき j は最大限に大きく取る必要がある
i^(j+1) では n を超えてしまう
つまり
i^(j+1) > n = i^j + k
i^(j+1) - i^j > k
i^j * (i-1) > k
が k の上界?
最小の k とは k=0 で n = i^j のとき
よって k の取りうる範囲は
0 <= k < i^j * (i-1)
j は n の最大が 10^18 なので整数型の2の補数表現的に j < 64 ではあるはず
jを固定することを考える
j = 0 のとき i=1 k=n が最適?
n = 1^0 + n -> ans = 1 + 0 + n
j = 1 のとき i=n k=0 が最適?
n = n^1 + 0 -> ans = n + 1 + 0
j = 2 のとき i は
pow(n,1/3) < i <= pow(n,1/2)
の範囲
i^2 のときの k と
(i-1)^2 のとき k' と比較すると
k = n - i^2
k' = n - (i-1)^2
k' - k = n - (i-1)^2 - (n - i^2)
= i^2 - (i-1)^2
= (i + (i-1)) * (i - (i-1))
= 2*i - 1
つまり j を固定したとき i は最大限に大きく取ったほうがよい?
*/
ID 21712