poj 3070 Fibonacci 矩阵快速幂

题目链接:http://poj.org/problem?id=3070

In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 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 integer n, your goal is to compute the last 4 digits of Fn.

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 of Fn. If the last four digits of Fn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., print Fn mod 10000).

题意描述:菲波那契数列可以用题中那个矩阵计算得到,给出n(n可以超大),求出Fn。

算法分析:赤果果的矩阵快速幂。如果对矩阵快速幂不熟悉的话,可以先百度看看讲解。

 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstring>

 4 #include<cstdlib>

 5 #include<cmath>

 6 #include<algorithm>

 7 using namespace std;

 8 const int mod=10000;

 9 

10 int n;

11 struct matrix

12 {

13     int an[2][2];

14 }res;

15 matrix multiply(matrix a,matrix b)

16 {

17     matrix s;

18     memset(s.an,0,sizeof(s.an));

19     for (int i=0 ;i<2 ;i++)

20     {

21         for (int j=0 ;j<2 ;j++)

22         {

23             for (int k=0 ;k<2 ;k++)

24             {

25                 s.an[i][j] += a.an[i][k]*b.an[k][j];

26                 if (s.an[i][j]>mod) s.an[i][j]%=mod;

27             }

28         }

29     }

30     return s;

31 }

32 void calc(int n)

33 {

34     matrix sum;

35     for (int i=0 ;i<2 ;i++)

36     {

37         for (int j=0 ;j<2 ;j++)

38         sum.an[i][j]= i==j ? 1 : 0 ;

39     }

40     for (int i=0 ;i<2 ;i++)

41     {

42         for (int j=0 ;j<2 ;j++)

43         res.an[i][j]=1;

44     }

45     res.an[1][1]=0;

46     while (n)

47     {

48         if (n&1) sum=multiply(sum,res);

49         n >>= 1;

50         res=multiply(res,res);

51     }

52     printf("%d\n",sum.an[1][0]%mod);

53 }

54 

55 int main()

56 {

57     while (scanf("%d",&n)!=EOF && n!=-1)

58     {

59         calc(n);

60     }

61     return 0;

62 }

 

你可能感兴趣的:(fibonacci)