Time Limit: 1000MS | Memory Limit: 65536KB | 64bit IO Format: %I64d & %I64u |
Description
Our lovely KK has a difficult mathematical problem:he has a
N\left( 1\leq N\leq {10}^{18}\right)
meters steel,he will cut it into steels as many as possible,and he doesn't want any two of them be the same length or any three of them can form a triangle.
Input
The first line of the input file contains an integer
T\left( 1\leq T\leq 10\right)
, which indicates the number of test cases.
Each test case contains one line including a integer N\left( 1\leq N\leq {10}^{18}\right) ,indicating the length of the steel.
Each test case contains one line including a integer N\left( 1\leq N\leq {10}^{18}\right) ,indicating the length of the steel.
Output
For each test case, output one line, an integer represent the maxiumum number of steels he can cut it into.
Sample Input
1 6
Sample Output
3
Hint
1+2+3=6 but 1+2=3 They are all different and cannot make a triangle.
Source
BestCoder Round #71 (div.2)
每次减一个尽可能小的木棒--
代码:
#include<cstdio>
#define LL long long
void solve()
{
LL n;scanf("%lld",&n);
if (n<3)
{
printf("1\n");
return ;
}
LL shu[150];n-=3;
shu[0]=1;shu[1]=2;
for (int i=2;i;i++)
{
shu[i]=shu[i-1]+shu[i-2];
if (n<shu[i])
{
printf("%d\n",i);
return ;
}
n-=shu[i];
}
}
int main()
{
int t;scanf("%d",&t);
while (t--)
solve();
return 0;
}