矩阵快速幂

来源:互联网 发布:jsp音乐网站源码 编辑:程序博客网 时间:2024/06/06 16:40

1、HDU 1757 A Simple Math Problem

参考:http://www.cnblogs.com/wally/archive/2013/03/01/2938305.html


#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <cmath>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef unsigned int uint;const int mod = 1e9 + 7;const int INF = 0x7fffffff;int k, m;struct Matrix {    int det[10][10];};Matrix matrix;Matrix Mul(Matrix x, Matrix y);Matrix Pow(int n);int main(){#ifdef __AiR_H    freopen("in.txt", "r", stdin);#endif // __AiR_H    while (scanf("%d%d", &k, &m) != EOF) {        for (int i = 0; i < 10; ++i) {            scanf("%d", &matrix.det[0][i]);        }        for (int i = 1; i < 10; ++i) {            for (int j = 0; j < 10; ++j) {                if (i == (j + 1)) {                    matrix.det[i][j] = 1;                } else {                    matrix.det[i][j] = 0;                }            }        }        if (k < 10) {            printf("%d\n", k%m);        } else {            Matrix t = Pow(k - 9);            int ans = 0;            for (int i = 0; i < 10; ++i) {                ans += t.det[0][i] * (9 - i);                ans %= m;            }            printf("%d\n", ans);        }    }    return 0;}Matrix Mul(Matrix x, Matrix y)      //矩阵乘法{    Matrix ret;    for (int i = 0; i < 10; ++i) {        for (int j = 0; j < 10; ++j) {            ret.det[i][j] = 0;            for (int k = 0; k < 10; ++k) {                ret.det[i][j] += x.det[i][k] * y.det[k][j];            }            ret.det[i][j] %= m;        }    }    return ret;}Matrix Pow(int n)       //快速幂{    if (n == 1) {        return matrix;    }    if (n & 1) {        return Mul(matrix, Pow(n - 1));    }    Matrix t = Pow(n >> 1);    return Mul(t, t);}


2、HDU 1575 Tr A

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <cmath>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef unsigned int uint;const int mod = 9973;const int INF = 0x7fffffff;struct Matrix {    int det[20][20];};int n, k;Matrix matrix;Matrix Mul(Matrix x, Matrix y);Matrix Pow(int n);int main(){#ifdef __AiR_H    freopen("in.txt", "r", stdin);#endif // __AiR_H    int T;    scanf("%d", &T);    while (T--) {        scanf("%d%d", &n, &k);        for (int i = 0; i < n; ++i) {            for (int j = 0; j < n; ++j) {                scanf("%d", &matrix.det[i][j]);            }        }        Matrix t = Pow(k);        int ans = 0;        for (int i = 0; i < n; ++i) {            ans += t.det[i][i];            ans %= mod;        }        printf("%d\n", ans);    }    return 0;}Matrix Mul(Matrix x, Matrix y)      //矩阵乘法{    Matrix ret;    for (int i = 0; i < n; ++i) {        for (int j = 0; j < n; ++j) {            ret.det[i][j] = 0;            for (int k = 0; k < n; ++k) {                ret.det[i][j] += x.det[i][k] * y.det[k][j];            }            ret.det[i][j] %= mod;        }    }    return ret;}Matrix Pow(int n)       //快速幂{    if (n == 1) {        return matrix;    }    if (n & 1) {        return Mul(matrix, Pow(n - 1));    }    Matrix t = Pow(n >> 1);    return Mul(t, t);}

3、XTU 1243 2016

解题思路:

先对 2016 取模,然后再矩阵快速幂

注意:写重定向会 CE

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <cmath>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef unsigned int uint;const int mod = 7;const int INF = 0x7fffffff;const int maxn = 1e5 + 10;char s[maxn];struct Matrix {    int det[20][20];};Matrix matrix;Matrix Mul(Matrix x, Matrix y);Matrix Pow(int n);int main(){    while (scanf("%s", s) != EOF) {        int len = strlen(s);        int n = 0;        for (int i = 0; i < len; ++i) {            n = n*10 + s[i] - '0';            n %= 2016;        }        for (int i = 0; i < 2; ++i) {            for (int j = 0; j < 2; ++j) {                scanf("%d", &matrix.det[i][j]);            }        }        if (n == 0) {            printf("1 0\n");            printf("0 1\n");        } else {            Matrix t = Pow(n);            for (int i = 0; i < 2; ++i) {                printf("%d %d\n", t.det[i][0], t.det[i][1]);            }        }    }    return 0;}Matrix Mul(Matrix x, Matrix y)      //矩阵乘法{    Matrix ret;    for (int i = 0; i < 2; ++i) {        for (int j = 0; j < 2; ++j) {            ret.det[i][j] = 0;            for (int k = 0; k < 2; ++k) {                ret.det[i][j] += x.det[i][k] * y.det[k][j];            }            ret.det[i][j] %= mod;        }    }    return ret;}Matrix Pow(int n)       //快速幂{    if (n == 1) {        return matrix;    }    if (n & 1) {        return Mul(matrix, Pow(n - 1));    }    Matrix t = Pow(n >> 1);    return Mul(t, t);}


4、郭姐散步(二)

注意:需要判断n<0的情况(因为这个一直wa,自己人出的题也这么坑啊QwQ。。。

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <queue>#include <vector>#include <stack>#include <map>#include <set>#include <cmath>#include <cctype>#include <ctime>#include <cassert>using namespace std;#define REP(i, n) for (int i = 0; i < (n); ++i)#define eps 1e-9typedef long long ll;typedef pair<int, int> pii;const int INF = 0x7fffffff;const ll mod = 1e9 + 7;struct Matrix {    ll det[2][2];};Matrix ans;Matrix matrix;Matrix mul(Matrix x, Matrix y);void slove(ll n);int main() {#ifdef __AiR_H    freopen("in.txt", "r", stdin);#endif // __AiR_H    ll n;    int T;    scanf("%d", &T);    while (T--) {        matrix.det[0][0] = 2; matrix.det[0][1] = 1;        matrix.det[1][0] = 1; matrix.det[1][1] = 0;        ans.det[0][0] = 3; ans.det[0][1] = 0; ans.det[1][0] = 1; ans.det[1][1] = 0;        scanf("%lld", &n);        if (n < 0) { printf("0\n"); continue; }        if (n > 1) { slove(n - 1); printf("%lld\n", ans.det[0][0]); continue; }        if (n == 0) { printf("1\n"); continue; }        printf("3\n");    }#ifdef __AiR_H    printf("Time used = %.2fs\n", (double)clock() / CLOCKS_PER_SEC);#endif // __AiR_H    return 0;}Matrix mul(Matrix x, Matrix y) {    Matrix ret;    memset(ret.det, 0, sizeof(ret.det));    for (int i = 0; i < 2; ++i) {        for (int j = 0; j < 2; ++j) {            for (int k = 0; k < 2; ++k) {                ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;            }        }    }    return ret;}void slove(ll n) {    while (n) {        if (n & 1) { ans = mul(matrix, ans); }        matrix = mul(matrix, matrix); n >>= 1;    }}















0 0
原创粉丝点击