KK's Steel
Accepts: 187
Submissions: 674
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
我们可爱的KK遇到了一道数学难题:对于一条长为N(1≤N≤1018)米的钢管,最多可以锯成几根小钢管,使得锯成的钢管互不相等且均不能围成三角形。
输入描述
第一行一个数T(1≤T≤10),表示数据组数。 接着T行,每行一个整数N(1≤N≤1018),表示钢管的长度。
输出描述
对于每一个数据输出一个整数,表示可以锯成的钢管数。
输入样例
1 6
输出样例
3
Hint
1+2+3=6 1+2=3 他们都不相同且他们不能构成三角形。
这题想都没想到竟然是斐波那契数列来。其实1 : 1,2 : 2, 3 : 3 .。。。。。,所以只要将其加起来再比较大小就好了。还有的是如果相加和与n刚刚相等就要减一,否则减二。
AC代码:
#include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cstdio> #include<cmath> #include<ctime> #include<cstdlib> #include<queue> #include<vector> #include<set> using namespace std; const int T=1050000; #define inf 0x3f3f3f3fL #define mod 1000000000 typedef long long ll; typedef unsigned long long ULL; ll t[T]; void play_table() { t[1] = 1; t[2] = 2; for(int i=3;i<=91;i++){ t[i] = t[i-1]+t[i-2]; /*printf("%d %lld\n",i,t[i]);*/ } } int main() { #ifdef zsc freopen("input.txt","r",stdin); #endif ll N,n,m,i,j,k; scanf("%lld",&N); play_table(); while(N--) { scanf("%lld",&n); for(i=1,m=0;i<=91;++i){ if(m>=n){ break; } m+=t[i]; } printf("%lld\n",i-1-(m!=n)); } return 0; }