Fibonacci (矩阵快速幂 + 斐波那契数列)

Fibonacci

Time Limit:1000MSMemory Limit:65536K

Total Submissions:10096Accepted:7208

Description

In the Fibonacci integer sequence,F0= 0,F1= 1, andFn=Fn 1+Fn 2forn≥ 2. For example, the first ten terms of the Fibonacci sequence are:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

An alternative formula for the Fibonacci sequence is

.

Given an integern, your goal is to compute the last 4 digits ofFn.

Input

The input test file will contain multiple test cases. Each test case consists of a single line containing n (where 0 ≤n≤ 1,000,000,000). The end-of-file is denoted by a single line containing the number 1.

Output

For each test case, print the last four digits ofFn. If the last four digits ofFnare all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., printFnmod 10000).

Sample Input

099999999991000000000-1

Sample Output

0346266875

Hint

As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by

.

Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:

.

Source

[Submit] [Go Back] [Status] [Discuss]

通过这道题,练习了下矩阵快速幂的做法,还有学到了斐波那契数列的快速求法

AC代码:

#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int MOD = 10000;struct matrix {//矩阵 int m[2][2];}ans;matrix base = {1, 1, 1, 0}; matrix multi(matrix a, matrix b) {//矩阵相乘,返回一个矩阵 matrix tmp;for(int i = 0; i < 2; i++) {for(int j = 0; j < 2; j++) {tmp.m[i][j] = 0;for(int k = 0; k < 2; k++)tmp.m[i][j] = (tmp.m[i][j] + a.m[i][k] * b.m[k][j]) % MOD;}}return tmp;}int matrix_pow(matrix a, int n) {//矩阵快速幂,矩阵a的n次幂 ans.m[0][0] = ans.m[1][1] = 1;//初始化为单位矩阵 ans.m[0][1] = ans.m[1][0] = 0;while(n) {if(n & 1) ans = multi(ans, a);a = multi(a, a);n >>= 1;}return ans.m[0][1];}int main() {int n;while(scanf("%d", &n), n != -1) {printf("%d\n", matrix_pow(base, n));}return 0;}

,缘是浪漫的相遇,瞬间让你我的心化为永恒!

Fibonacci (矩阵快速幂 + 斐波那契数列)

相关文章:

你感兴趣的文章:

标签云: