Description
Our lovely KK has a difficult mathematical problem:he has a Nleft( 1leq Nleq {10}^{18}
ight) 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 Tleft( 1leq Tleq 10
ight),
which indicates the number of test cases.
Each test case contains one line including a integer Nleft( 1leq Nleq {10}^{18} ight),indicating the length of the steel.
Each test case contains one line including a integer Nleft( 1leq Nleq {10}^{18} ight),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.
把一个数分成不等的数相加 并且这些数任意三个不能构成三角形
直接求这个数可以分出多少个菲波那切数
#include<bits/stdc++.h>
__int64 zu[200001];
int main()
{
for(__int64 i=2;i<200001;i++)
{
zu[1]=1;
zu[2]=2;
zu[i+1]=zu[i]+zu[i-1];
}
__int64 t,n;
scanf("%I64d",&t);
while(t--)
{
__int64 cut=0;
scanf("%I64d",&n);
if(n<6)
{
printf("0
");
continue;
}
for(__int64 i=1;i<200001;i++)
{
n-=zu[i];
if(n<0)
{
break;
}
cut++;
}
printf("%I64d
",cut);
}
return 0;
}