hdu 1757 A Simple Math Problem

http://acm.hdu.edu.cn/showproblem.php?pid=1757

  如题,简单的矩阵快速幂。1y!

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

——written by Lyon

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