將 N 轉成二進制
當 N 是奇數的時候 (N-1)>>1 = N>>1 , (N+1)>>1=(N>>1)+1
所以當你不斷切成兩堆的時候 你最多也就兩種數字 x , x+1
不斷對所有橘子切成兩堆直到最小片的數量切完後會小於b
令當前最小片數 L=1, 最大片數 R =0
當 N 是奇數的時候, N+1 就會是偶數 所以 N 會分同等份量給 N+1, 而 N+1會乘二 , R=R*2+L, L=L
反之,當 N是偶數 N+1 就是奇數 所以 L=L*2+R, R=R
最後當N/2<b 的時候 有可能 N/2+1==b
這時候如果N是奇數的話 L=L, R=R*2+L=L+R+R 相當於ans+=R
如果是N是偶數的話 L=L*2, 但L相當於N/2的片數 N/2<b所以不用考慮進去
以下是數字舉個例子
以 L 代表較小片的橘子數 , R 代表較大片的橘子數
N=21,M=3, binary=10101, [10101]
初始 L=1, R=0
切半後 N=10 or 11, [1010, 1011]
L=1, R=R*2+L=1 (L所代表的數字10, R所代表的數字11)
切半後 N=5 or 6 [101, 101, 101, 110]
L=L*2+R=3, R=1
接下來 5 / 2= 2 < M 但因為 5 / 2+1==M 所以再補上數量 R
切半後 N=2 or 3 [10, 11, 10, 11, 10, 11, 11, 11]
L=L=3, R=R*2+L=5
ans = 5
如果有人仍表示不清楚 我會努力補充的 謝謝
開 ios::cin.tie, cout.tie 但 cout<<endl; TLE
改成 "\n" 0.7s
改用 scanf printf 0.4s