1034: 猴子吃桃
时间限制: 1 Sec 内存限制: 128 MB提交: 82 解决: 48
[ 提交][ 状态][ 讨论版]
题目描述
猴妈妈给小猴子们准备了N个桃子,无数个小猴子排队去领桃子吃,排在第一个的领1个桃子,排在第二个的领2个桃子,排在第三个的领4个桃子,排在第四个的领8个桃子,以此类推,一旦桃子不够了,猴妈妈就把剩下的桃子给下一个猴子,然后其余的小猴子就得挨饿了^_^
现在,有一只小猴子想拿到最多的桃子,那么它应该排在第几个位置,又能吃到几个桃子呢?
输入
有多组输入数据,第一行为一个数字T,代表有T组输入数据 (0<T<=20)。
接下来有T行,每行一个正整数N(0<T<=10^9),表示猴子妈妈准备的桃子个数。
输出
一共T行。
对于每一组数据,输出两个数字,分别表示小猴子应该排在第几个位置上,能吃到几个桃子,若排在两个位置能吃到的桃子数一样,则输出排位靠前的位置号。
样例输入
2
1
6
样例输出
1 1
3 3
思路:枚举每个位置,当此位置小于等于剩下的桃子并且大于前一个猴子的桃子即可打印;
#include<stdio.h>
#include<iostream>
#include<algorithm>
long int pow( int x,int n)
{
if(!n)
return 1;
long int i;
i=x;
n=n-1;
while(n--)
{
x=x*i;
}
return x;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
long int n,i;
scanf("%ld",&n);
if(n==1)
{
printf("1 1\n");
continue;
}
long int c=0;
for(i=1;;i++)
{
long int a,b;
a=pow(2,i-1)-1;
b=n-a;
if(b<=c)
{
printf("%ld %ld\n",i-1,c);
break;
}
if(b>pow(2,i-1))
{
c=pow(2,i-1);
}
else if(b<=pow(2,i-1)&&b>=pow(2,i-2))
{
printf("%ld %ld\n",i,b);
break;
}
}
}
return 0;
}