POJ-3070 Fibonacci 矩阵乘法

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

  矩阵乘法优化,水题一枚。

 1 //STATUS:C++_AC_132MS_0KB

 2 #include<stdio.h>

 3 #include<stdlib.h>

 4 #include<string.h>

 5 #include<math.h>

 6 #include<iostream>

 7 #include<string>

 8 #include<algorithm>

 9 #include<vector>

10 #include<queue>

11 #include<stack>

12 #include<map>

13 using namespace std;

14 #define LL __int64

15 #define pii pair<int,int>

16 #define Max(a,b) ((a)>(b)?(a):(b))

17 #define Min(a,b) ((a)<(b)?(a):(b))

18 #define mem(a,b) memset(a,b,sizeof(a))

19 #define lson l,mid,rt<<1

20 #define rson mid+1,r,rt<<1|1

21 const int N=25,INF=0x3f3f3f3f,MOD=10000,STA=8000010;

22 const double DNF=1e13;

23 

24 struct Matrix{

25     LL ma[2][2];

26     Matrix friend operator * (const Matrix& a,const Matrix& b){

27         Matrix ret;

28         mem(ret.ma,0);

29         int i,j,k;

30         for(i=0;i<2;i++){

31             for(j=0;j<2;j++){

32                 for(k=0;k<2;k++)

33                     ret.ma[i][j]=(ret.ma[i][j]+a.ma[i][k]*b.ma[k][j])%MOD;

34             }

35         }

36         return ret;

37     }

38 }a,f;

39 

40 int n;

41 

42 void mutilpow(int k)

43 {

44     int i,j;

45     mem(f.ma,0);

46     f.ma[0][0]=f.ma[1][1]=1;

47     for(;k;k>>=1){

48         if(k&1)f=f*a;

49         a=a*a;

50     }

51 }

52 

53 int main()

54 {

55  //   freopen("in.txt","r",stdin);

56     int i,j;

57     LL ans;

58     while(~scanf("%d",&n) && n!=-1)

59     {

60         a.ma[0][0]=0;a.ma[0][1]=1;

61         a.ma[1][0]=a.ma[1][1]=1;

62         if(n>=2){

63             mutilpow(n-2);

64             ans=f.ma[1][0]+f.ma[1][1];

65         }

66         else ans=n;

67 

68         printf("%I64d\n",ans%MOD);

69     }

70     return 0;

71 }

 

你可能感兴趣的:(fibonacci)