题目1387:斐波那契数列
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1656
解决:467
-
题目描述:
-
大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。斐波那契数列的定义如下:
-
输入:
-
输入可能包含多个测试样例,对于每个测试案例,
输入包括一个整数n(1<=n<=70)。
-
输出:
-
对应每个测试案例,
输出第n项斐波那契数列的值。
-
样例输入:
-
3
-
样例输出:
-
2
//用矩阵乘法解决Fibonacci,这个题直接将Fibonacci数列存在数组里,用for循环赋值也可以解决,要注意的是数据类型也要是long long
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
int main()
{
int k,kk;
long long t1,t2,t3,t4;
long long M00,M01,M10,M11;
long long temprow1,row1,row2;
while(cin>>k)
{
if(k==1)
{
cout << 1 << endl;
continue;
}
M00=1,M01=1,M10=1,M11=0;
row1=1,row2=0;
kk=k-1;
while(kk>=1)
{
if(kk%2==0)
{
//临时矩阵存当前分割时的矩阵,分割矩阵次数递增
t1=M00*M00+M01*M10;
t2=M00*M01+M01*M11;
t3=M10*M00+M11*M10;
t4=M10*M01+M11*M11;
M00=t1;
M01=t2;
M10=t3;
M11=t4;
kk/=2;
}
else
{
temprow1=row1;//没有temprow1就eggs broken吧
row1=M00*row1+M01*row2;
row2=M10*temprow1+M11*row2;
--kk;
}
}
cout << row1 << endl;
}
return 0;
}
/**************************************************************
Problem: 1387
User: true14fans
Language: C++
Result: Accepted
Time:10 ms
Memory:1520 kb
****************************************************************/