您的位置:首页 > 其它

51nod 1242 斐波那契数列的第N项(矩阵幂运算)

2017-10-04 12:50 218 查看
1242 斐波那契数列的第N项


基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题


 收藏


 关注

斐波那契数列的定义如下:

F(0) = 0
F(1) = 1
F(n) = F(n - 1) + F(n - 2) (n >= 2)

(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, ...)
给出n,求F(n),由于结果很大,输出F(n) % 1000000009的结果即可。

Input
输入1个数n(1 <= n <= 10^18)。


Output
输出F(n) % 1000000009的结果。


Input示例
11


Output示例
89


//矩阵幂运算
//注意是long long类型
#include<stdio.h>
#include<string.h>
using namespace std;
#define data 1000000009
struct mat{
long long a[2][2];
};
mat mat_return(mat x,mat y){
mat res;
memset(res.a ,0,sizeof(res.a));
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
for(int k=0;k<2;k++)
{
res.a[i][j]=(res.a[i][j]+x.a[i][k]*y.a[k][j]%data)%data;
}
return res;
}
int main()
{
long long n;
while(~scanf("%lld",&n)){
mat c,res;
c.a[0][0]=c.a[0][1]=c.a[1][0]=1;//赋值 1,1,1,0;
c.a[1][1]=0;
memset(res.a,0,sizeof(res.a ));
for(int i=0;i<2;i++)
res.a[i][i]=1;//单位矩阵 ,都一样
while(n>0){//接下来就类似快速幂运算了
if(n&1)
res=mat_return(res,c);
c=mat_return(c,c);
n/=2;
}
printf("%lld\n",res.a [0][1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  矩阵幂运算