Problem Description
Our lovely KK has a difficult mathematical problem:he has a N(1≤N≤1018) 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(1≤T≤10), which indicates the number of test cases.
Each test case contains one line including a integer N(1≤N≤1018),indicating the length of the steel.
Each test case contains one line including a integer N(1≤N≤1018),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
题意:
给你一个长度为N的钢管,问最多切成几个钢管,使得这些钢管不能围成三角形,并且不能有相同长度 !
思路:
要想使得钢管尽量多,那肯定从1开始吧,有了1,且不能重复,那肯定找2吧,而且三个钢管不能围成,三角形,那直接找a1 + a2 = a3的情况不就恰好不能围成三角形吗。所以很明显,这是一个a1 = 1,a2 = 2的斐波那契数列,找到第一个i 是的前i项和大于N,即可!特殊判断N = 1,N=2即可!他们都是1!
1 #pragma comment(linker, "/STACK:1024000000,1024000000") 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 #include<math.h> 7 #include<algorithm> 8 #include<queue> 9 #include<set> 10 #include<bitset> 11 #include<map> 12 #include<vector> 13 #include<stdlib.h> 14 using namespace std; 15 #define ll long long 16 #define eps 1e-10 17 #define MOD 1000000007 18 #define N 1000000 19 #define inf 1e12 20 ll n; 21 ll f[N]; 22 void init(){ 23 f[1]=1; 24 f[2]=2; 25 for(ll i=3;i<N;i++){ 26 f[i]=f[i-2]+f[i-1]; 27 } 28 } 29 int main() 30 { 31 init(); 32 int t; 33 scanf("%d",&t); 34 while(t--){ 35 scanf("%I64d",&n); 36 ll sum=0; 37 ll i; 38 for(i=1;i<N;i++){ 39 sum+=f[i]; 40 if(sum>n){ 41 break; 42 } 43 } 44 if(n==1 || n==2){ 45 printf("1 "); 46 continue; 47 } 48 printf("%I64d ",i-1); 49 } 50 return 0; 51 }