結果

問題 No.2241 Reach 1
ユーザー navel_tosnavel_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
権限があれば一括ダウンロードができます

ソースコード

diff #

#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)









0