#32357: 最快的解法(36ms, 96KB)


suen333robot@gmail.com (Hello World)

學校 : 不指定學校
編號 : 85877
來源 : [140.113.138.241]
最後登入時間 :
2024-03-22 01:55:28
h664. 河內塔 (Hanoi) -- TOI練習賽202203潛力組第3題 | From: [114.27.167.90] | 發表日期 : 2022-10-02 13:24

不論層數為何

光看第n步需要移動哪一層就可以發現規律

[ (1 2 1) 3 (1 2 1) ] 4 [ (1 2 1) 3 (1 2 1) ] 5 [ (1 2 1) 3 (1 2 1)  ] 4 [ (1 2 1) 3 (1 2 1) ]...

也就是說答案只跟步數有關,而跟層數無關!!

然後看一下n的二進位值跟解答的對應關係:

00001  ->  1

00010  ->  2

00011  ->  1

00100  ->  3

00101  ->  1

00110  ->  2

00111  ->  1

01000  ->  4

會發現答案就是「從最低位數來第一個不為0的位置」~~~

例: 第52步的二進位值為110100,右邊第3位開始不為0,因此答案為3~~~

tips: 可以用(step&1)取得最後一位的數字,每次迴圈完就step>>=1,看幾次之後(step&1)不為0就是答案

 
#32364: Re: 最快的解法(36ms, 96KB)


rollfc (胖胖貓)

學校 : 國立清華大學
編號 : 81012
來源 : [36.229.32.12]
最後登入時間 :
2024-04-25 19:27:08
h664. 河內塔 (Hanoi) -- TOI練習賽202203潛力組第3題 | From: [114.43.69.157] | 發表日期 : 2022-10-03 00:56

x & -x 可以取得x的二進位最後一個 bit 的(十進位)值 
__lg( x & -x ) 則能將上述的值轉換為2的次方項

 
#32478: Re: 最快的解法(36ms, 96KB)


suen333robot@gmail.com (Hello World)

學校 : 不指定學校
編號 : 85877
來源 : [140.113.138.241]
最後登入時間 :
2024-03-22 01:55:28
h664. 河內塔 (Hanoi) -- TOI練習賽202203潛力組第3題 | From: [111.254.236.137] | 發表日期 : 2022-10-14 23:36

x & -x 可以取得x的二進位最後一個 bit 的(十進位)值 
__lg( x & -x ) 則能將上述的值轉換為2的次方項


剛剛發現有內建函數:

 __builtin_ctz(a) :可以返回右邊第一個1之後的0的個數,+1即可

或者直接用

 __builtin_ffs(a) :可以返回右邊第一個1的位置

不知道為什麼但前者實測比較快

 
ZeroJudge Forum