51Nod-1242 斐波那契数列的第n项

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

斐波那契数列求第n项(当n非常大时),利用矩阵快速幂计算是fefe非常迅速的

#include<iostream>
#include<stdio.h>
#include<cstring>
using namespace std;
#define LL long long

const LL INF = 1000000009;

LL n;

struct Node {
	LL c[2][2];
} t;

Node mult(Node a, Node b) {
	Node c = {0};
	for(int i = 0; i < 2; i++)
		for(int j = 0; j < 2; j++)
			for(int k = 0; k < 2; k++) {
				c.c[i][j] += (a.c[i][k] * b.c[k][j]) % INF;
				c.c[i][j] %= INF;
			}
	return c;
}

Node pow(LL n) {
	Node pt = t;
	if(n < 0) return pt;
	while(n) {
		if( n & 1 ) {
			pt = mult(pt, t);
			n--;
		}
		t = mult(t, t);
		n = n >> 1;
	}
	return pt;
}

int main() {
	while(cin>>n) {
		t.c[0][0] = 1;
		t.c[0][1] = 1;
		t.c[1][0] = 1;
		t.c[1][1] = 0;
		Node ans = pow(n-2);
		printf("%lld\n", ans.c[0][0] * 1);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Revenant_Di/article/details/81435402
今日推荐