1,2,…,n表示n個盤子.數字大盤子就大.n個盤子放在第1根柱子上.大盤不能放在小盤上. 在第1根柱子上的盤子是a1,a2,…,an. a1=n,a2=n-1,…,an=1.即a1 是最下 面的盤子.把n個盤子移動到第3根柱子.每次只能移動1個盤子,且大盤不能放在小盤上. 問第m次移動的是那一個盤子. Input 每行2個整數n (1 ≤ n ≤ 63) ,m≤ 2^n-1.n=m=0退出 Output 輸出第m次移動的盤子的號數. Sample Input
63 163 20 0Sample Output
12先來看看盤子數比較小的時候情況:
當n==1時
1當n==2時
1 2 1當n==3時
1 2 1 3 1 2 1當n==4時
1 2 1 3 1 2 1 4 1 2 1 3 1 2 1由此可見,可以根據“從大到小”取的規則,判斷是否整除即可。
#include<iostream>using namespace std;int main(){ long long n,m; while(cin>>n>>m) { if(n==0&&m==0) break; long long ans=1,cnt=1; for(int i=0;i<n-1;i++) ans*=2; for(int i=n;i>=1;i--) { if(m%ans==0) { cnt=i; break; } ans/=2; } cout<<cnt<<endl; } return 0;}新聞熱點
疑難解答