面试题9:斐波那契数列

题目链接:http://ac.jobdu.com/problem.php?pid=1387

思路:下面是斐波那契额数列的数学公式

利用上面的公式和矩阵快速幂可以在logn的时间复杂度内解决问题。

注:具体矩阵快速幂的思想是怎么样的,可以自己搜索,网上资料很多。

这题当然可以暴力,然后将所有的结果存下来,毕竟只有70组数据,不过这样未免!!!

code:

 1 // 斐波那契额数列

 2 

 3 #include <cstdio>

 4 #include <cstring>

 5 using namespace std;

 6 const int M = 2;

 7 const int MOD = 1000000007;

 8 typedef long long LL;

 9 LL ans[M][M];

10 LL tmp[M][M];

11 

12 // 矩阵乘法

13 void matrixMul(LL mat1[M][M], LL mat2[M][M])

14 {

15     LL mat3[M][M];

16     for (int i = 0; i < M; ++i)

17     {

18         for (int j = 0; j < M; ++j)

19         {

20             mat3[i][j] = 0;

21             for (int k = 0; k < M; ++k)

22                 mat3[i][j] += mat1[i][k] * mat2[k][j];

23         }

24     }

25     memcpy(mat1, mat3, sizeof(mat3));

26 }

27 

28 // 矩阵快速幂

29 void matrixQuickMod(int n)

30 {

31     tmp[0][0] = 1;

32     tmp[0][1] = 1;

33     tmp[1][0] = 1;

34     tmp[1][1] = 0;

35 

36     // 将ans处理成单位矩阵

37     memset(ans, 0, sizeof(ans));

38     for (int i = 0; i < M; ++i) ans[i][i] = 1;

39 

40     while (n)

41     {

42         if (n & 1) matrixMul(ans, tmp);        // 当n为奇数时,跟新ans

43         n >>= 1;

44         matrixMul(tmp, tmp);    // 当n为偶数时跟新tmp

45     }

46 }

47 

48 int main()

49 {

50     int n;

51     while (scanf("%d", &n) != EOF)

52     {

53         matrixQuickMod(n - 1);    

54         printf("%lld\n", ans[0][0]);

55     }

56     return 0;

57 }

 

你可能感兴趣的:(面试题)