HDU 1757 矩阵快速幂

来源:互联网 发布:mac登录不上apple id 编辑:程序博客网 时间:2024/06/05 05:12

传送门: HDU 1757

题解:

简单的矩阵构造
构造矩阵时注意数组不要溢出, 或者把数组开大


构造

|0 1 0 ……… .0| * |f(0)| = | f(1) |
|0 0 1 ………. 0| * |f(1)| = | f(2) |
|…………………1| * |……| = |……..|
|a9 a8 ………a0| * |f(9)| = |f(10)|

注意取模

code:

/*adrui's submissionLanguage : C++Result : AcceptedLove : llFavorite : Dragon BallsStanding in the Hall of Fame*/#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;#define debug 0#define LL long long#define M(a, b) memset(a, b, sizeof(a))int k, m;struct Matrix {                             //矩阵    int mat[10][10];    void init() {        M(mat, 0);        for (int i = 0; i < 10; i++)            mat[i][i] = 1;    }    void Debug() {                          //debug        for (int i = 0; i < 10; i++)            for (int j = 0; j < 10; j++)                printf("%d%s", this->mat[i][j], j == 9 ? "\n" : " ");    }};Matrix operator * (Matrix a, Matrix t) {                //矩阵乘法    Matrix c;    M(c.mat, 0);    for (int i = 0; i < 10; i++)        for (int j = 0; j < 10; j++)        {            for (int k = 0; k < 10; k++)                c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * t.mat[k][j]) % m;        }    return c;}Matrix operator ^ (Matrix tmp, int b) {                    //快速幂    Matrix res;    res.init();    while (b) {        if (b & 1) res = res * tmp;        tmp = tmp * tmp;        b >>= 1;    }    return res;}int main() {#if debug    freopen("in.txt", "r", stdin);#endif //debug    while (~scanf("%d%d", &k, &m)) {        if (k < 10)            printf("%d\n", k % m);        else {            Matrix tmp;            M(tmp.mat, 0);           //构造底数矩阵            for (int i = 0; i < 10; i++) {                scanf("%d", &tmp.mat[0][i]);                if(i <= 8)                    tmp.mat[i + 1][i] = 1;     //注意防溢出            }              //tmp.Debug();            Matrix res = tmp ^ (k - 9);         //快速幂            //res.Debug();            int ans = 0;            for (int i = 0; i < 10; i++) {                ans = (ans + i * res.mat[0][9 - i]) % m;            }            printf("%d\n", ans);        }    }    return 0;}
1 0