poj 3070 Fibonacci

http://poj.org/problem?id=3070

  入门级矩阵快速幂,自己打了个属于自己的模板!

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 typedef __int64 ll;
 8 const int mod = 10000;
 9 const int matSize = 100;
10 
11 struct Matrix {
12     ll val[matSize][matSize];
13 
14     Matrix(bool Init = false) {
15         for (int i = 0; i < matSize; i++) {
16             for (int j = 0; j < matSize; j++) {
17                 val[i][j] = 0;
18             }
19             if (Init) val[i][i] = 1;
20         }
21     }
22 
23 
24     void print() {
25         for (int i = 0; i < matSize; i++) {
26             for (int j = 0; j < matSize; j++) {
27                 printf("%I64d ", val[i][j]);
28             }
29             puts("");
30         }
31         puts("~~~");
32     }
33 } Base;
34 
35 Matrix operator * (Matrix _a, Matrix _b) {
36     Matrix ret = Matrix();
37 
38     for (int i = 0; i < matSize; i++) {
39         for (int k = 0; k < matSize; k++) {
40             if (_a.val[i][k]) {
41                 for (int j = 0; j < matSize; j++) {
42                     ret.val[i][j] += _a.val[i][k] * _b.val[k][j];
43                     ret.val[i][j] %= mod;
44                 }
45             }
46         }
47     }
48 
49     return ret;
50 }
51 
52 Matrix operator ^ (Matrix _a, ll _p) {
53     Matrix ret = Matrix(true);
54 
55     while (_p) {
56         if (_p & 1) {
57             ret = ret * _a;
58         }
59         _a = _a * _a;
60         _p >>= 1;
61     }
62 
63     return ret;
64 }
65 
66 void initBase(ll _k = 1, ll _a = 1) {
67     Base.val[0][1] = _k;
68     Base.val[1][1] = _a;
69     Base.val[0][0] = 0;
70     Base.val[1][0] = 1;
71 }
72 
73 ll fun(ll _x) {
74     Matrix ret = Matrix();
75 
76     ret.val[0][0] = 0;
77     ret.val[0][1] = 1;
78 
79     ret = ret * (Base ^ _x);
80 //    ret.print();
81 
82     return ret.val[0][0];
83 }
84 
85 ll deal(ll _x) {
86     return fun(_x);
87 }
88 
89 int main() {
90     ll n;
91 
92     initBase();
93 //    Base.print();
94     while (~scanf("%I64d", &n) && ~n) {
95         printf("%I64d\n", deal(n));
96     }
97 
98     return 0;
99 }

——wirtten by Lyon

原文地址:https://www.cnblogs.com/LyonLys/p/poj_3070_Lyon.html