BestCoder Round #71 (div.2)-KK's Steel(斐波那契数列)

探讨钢管锯割问题与斐波那契数列的应用
本文深入分析了一道数学难题,即如何利用钢管锯割成互不相等且不能围成三角形的小钢管,并揭示了其中蕴含的斐波那契数列规律。通过实例演示了如何解决此类问题,提供了有效的算法实现,帮助读者理解数学与实际应用之间的桥梁。

KK's Steel

 
 Accepts: 187
 
 Submissions: 674
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)
问题描述
我们可爱的KK遇到了一道数学难题:对于一条长为N\left( 1\leq N\leq {10}^{18}\right)N(1N1018)米的钢管,最多可以锯成几根小钢管,使得锯成的钢管互不相等且均不能围成三角形。
输入描述
第一行一个数T\left( 1\leq T\leq 10\right)T(1T10),表示数据组数。
接着T行,每行一个整数N\left( 1\leq N\leq {10}^{18}\right)N(1N1018),表示钢管的长度。
输出描述
对于每一个数据输出一个整数,表示可以锯成的钢管数。
输入样例
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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值