結果

問題 No.2241 Reach 1
ユーザー navel_tosnavel_tos
提出日時 2023-03-10 23:06:24
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
AC  
実行時間 30 ms / 2,000 ms
コード長 2,508 bytes
コンパイル時間 457 ms
コンパイル使用メモリ 11,848 KB
実行使用メモリ 10,072 KB
最終ジャッジ日時 2023-10-18 08:48:34
合計ジャッジ時間 3,588 ms
ジャッジサーバーID
(参考情報)
judge13 / judge15
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 30 ms
10,072 KB
testcase_01 AC 29 ms
10,072 KB
testcase_02 AC 29 ms
10,072 KB
testcase_03 AC 29 ms
10,072 KB
testcase_04 AC 29 ms
10,072 KB
testcase_05 AC 30 ms
10,072 KB
testcase_06 AC 30 ms
10,072 KB
testcase_07 AC 29 ms
10,072 KB
testcase_08 AC 29 ms
10,072 KB
testcase_09 AC 29 ms
10,072 KB
testcase_10 AC 29 ms
10,072 KB
testcase_11 AC 30 ms
10,072 KB
testcase_12 AC 29 ms
10,072 KB
testcase_13 AC 29 ms
10,072 KB
testcase_14 AC 29 ms
10,072 KB
testcase_15 AC 29 ms
10,072 KB
testcase_16 AC 29 ms
10,072 KB
testcase_17 AC 29 ms
10,072 KB
testcase_18 AC 30 ms
10,072 KB
testcase_19 AC 28 ms
10,072 KB
testcase_20 AC 29 ms
10,072 KB
testcase_21 AC 29 ms
10,072 KB
testcase_22 AC 29 ms
10,072 KB
testcase_23 AC 29 ms
10,072 KB
testcase_24 AC 29 ms
10,072 KB
testcase_25 AC 30 ms
10,072 KB
testcase_26 AC 30 ms
10,072 KB
testcase_27 AC 29 ms
10,072 KB
testcase_28 AC 29 ms
10,072 KB
testcase_29 AC 29 ms
10,072 KB
testcase_30 AC 29 ms
10,072 KB
testcase_31 AC 29 ms
10,072 KB
testcase_32 AC 30 ms
10,072 KB
testcase_33 AC 30 ms
10,072 KB
testcase_34 AC 30 ms
10,072 KB
権限があれば一括ダウンロードができます

ソースコード

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