题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2175
题目描述:
题目思路:
//盒子总数n=1:1
//n=2:121
//2的位置为2^(2-1)即为2
//n=3:1213121
//3的位置为2^(3-1)即为4
//n=4:121312141213121
//4的位置为:2^(4-1)即为8
//n=5:1213121412131215121312141213121
//5的位置为:2^(5-1)即为16
//那么可得每个总个数为n的情况下,其第n个盒子所在的位置为2^(n-1)
//再观察下:
//比如n=4:121312141213121
//此时的1的位置为,1,3,5,7,9,11,13,15
//此时的2的位置为,2,6,10,14
//此时的3的位置为,4,12
//正好发现其的位置为:(1,3,5…)*(2^(n-1))
//2也就是(1,3,5,7)*2
//3也就是(1,3)*4
所以就可以编程了,只要是奇数的话,就只能是盒子1;
如果是偶数的话,从63到2一个一个看能否整除其的值,如果能够整除的话就代表着其就是所移动的那个盒子(注意,不能直接从小找到大,因为能整除4的自然也能整除2,但是能整除2的不一定能整除4。)
ac代码:
#include<stdio.h>
typedef long long int ll;
int main(){
ll value[64];//用来存第每个总数盒子的所在位置2^(n-1)
value[1] = 1;
for(int i = 2;i < 64;i++){
value[i] = value[i-1]*2;
}
int n;
ll m;
while(scanf("%d%lld",&n,&m) != EOF){
if(n == 0 && m == 0) break;
if(m%2 == 1){//如果是奇数肯定只能是1
printf("1\n");
}else{
for(int i = 63;i >= 2;i--){
if(m % value[i] == 0){
printf("%d\n",i); break;
}
}
}
}
return 0;
}