結果
| 問題 |
No.2241 Reach 1
|
| ユーザー |
navel_tos
|
| 提出日時 | 2023-03-10 23:06:24 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
AC
|
| 実行時間 | 29 ms / 2,000 ms |
| コード長 | 2,508 bytes |
| コンパイル時間 | 648 ms |
| コンパイル使用メモリ | 12,672 KB |
| 実行使用メモリ | 10,624 KB |
| 最終ジャッジ日時 | 2024-09-18 05:15:27 |
| 合計ジャッジ時間 | 2,478 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 35 |
ソースコード
#yukicoder380C Reach 1
'''
m=N から変数の操作を開始する。
最小の操作回数でm=1にせよ。
①m/2^k が整数となる非負整数kを選び、mをm/2^k に置換する
②mをmk+1 に置換する
①の操作でしかm=1にできないのは自明。
ゆえに①②の反復で、最速で2の冪乗にするのを目指せばよい。
m=3 なら 3*5+1 で終了。
m=5 なら 5*3+1 で終了。
(2^k-1)(2^k+1)=(2^k)^2-1 だからそれはそうなんだが。
これ最速で 2^k か 2^k±1 を作りに行くゲームか?
2^kならそこから+1手、2^k±1ならそこから+2手で1を作れることは証明できる。
Nまで全探索は日が暮れるから工夫したい。
mが偶数のときは、おそらく割り切れるだけ割るのが最善。
10→21→64→1 なんて想定しなくていいよね?10→5→16→1 だよね?
mが奇数のときは、2^kに近づくほうを選択したい。
21の時に困るな。3をかけて64になるけど、これはちょっと。
dpで10^6くらいまで埋めてみてから考える?
それか愚直dp?
とりあえず2手まではわかるんだよな。
2^k が1手ゾーン、(2^k-1)(2^k+1) の約数が2手ゾーン。
2^k-2, 2^k+2 は3手ゾーンなのか?どうやらそうみたいだ。
2^k-3, 2^k+3 は4手ゾーン?
この考え方はそう遠くなさそうなんだけどね。
まったくわからない。
DFSチックにやってみるか?
奇数のときの扱いがまじでわからないんだよね。
2^kの余りがもっとも小さくなるように選ぶ感じ?
だとして、kはどこまで探索すればいい?
→めちゃくちゃ周期性あるんだけど。なんで?
2^k mod Nが循環する理由を考えている。
いや自明だわ。逆元か。
mod Nで1余るkを狙えばいいのか。
2とNが「互いに素であれば」そのようなkは存在する。
すなわち 2^k≡1 mod N となるkは存在する。
換言すると 2^k=N*p+1 となるpが存在するということ。
となると・・・
2^kの倍数なら手数1, 奇数なら手数2, 偶数なら手数3。どうだ?
'''
from collections import deque
N=int(input())
check=bin(N).lstrip('0b')
hantei=True
for i in range(1,len(check)):
if check[i]=='1':
hantei=False
if N%2==1:
print(2)
else:
if hantei:
print(1)
else:
print(3)
navel_tos