• 矩阵快速幂



    1 HDU 1575 Tr A

    2 HDU 1588 Gauss Fibonacci

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 int k, b, n, mod;
    26 struct Matrix { ll det[4][4]; };
    27 Matrix ans, ans_t, mat_t;
    28 
    29 Matrix mul(Matrix x, Matrix y) {
    30     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    31     for (int i = 0; i < 4; ++i) {
    32         for (int k = 0; k < 4; ++k) {
    33           if (x.det[i][k] == 0) { continue; }
    34             for (int j = 0; j < 4; ++j) {
    35                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    36             }
    37         }
    38     }
    39     return ret;
    40 }
    41 void solve(ll x) {
    42     while (x) {
    43         if (x & 1) { ans_t = mul(mat_t, ans_t); }
    44         mat_t = mul(mat_t, mat_t); x >>= 1;
    45     }
    46 }
    47 
    48 int main() {
    49 #ifdef __AiR_H
    50     freopen("in.txt", "r", stdin);
    51 //    freopen("out.txt", "w", stdout);
    52 #endif // __AiR_H
    53     while (scanf("%d %d %d %d", &k, &b, &n, &mod) != EOF) {
    54         memset(mat_t.det, 0, sizeof(mat_t.det));
    55         mat_t.det[0][1] = mat_t.det[1][0] = mat_t.det[1][1] = 1;
    56         memset(ans_t.det, 0, sizeof(ans_t.det));
    57         ans_t.det[0][0] = ans_t.det[1][1] = 1;
    58         if (k) { solve(k); } memset(mat_t.det, 0, sizeof(mat_t.det));
    59         for (int i = 0; i < 2; ++i) {
    60             for (int j = 0; j < 2; ++j) {
    61                 mat_t.det[i][j] = ans_t.det[i][j];
    62             }
    63             mat_t.det[i][i + 2] = mat_t.det[i + 2][i + 2] = 1;
    64         }
    65         memset(ans_t.det, 0, sizeof(ans_t.det));
    66         for (int i = 0; i < 4; ++i) { ans_t.det[i][i] = 1; }
    67         if (n) { solve(n); } ans = ans_t;
    68         memset(mat_t.det, 0, sizeof(mat_t.det));
    69         mat_t.det[0][1] = mat_t.det[1][0] = mat_t.det[1][1] = 1;
    70         memset(ans_t.det, 0, sizeof(ans_t.det));
    71         ans_t.det[0][0] = ans_t.det[1][1] = 1;
    72         if (b) { solve(b); }
    73         for (int i = 0; i < 2; ++i) {
    74             for (int j = 0; j < 2; ++j) {
    75                 ans.det[i][j] = ans.det[i][j + 2];
    76                 ans.det[i][j + 2] = ans.det[i + 2][j] = 0;
    77                 ans.det[i + 2][j + 2] = 0;
    78             }
    79         }
    80         ans = mul(ans, ans_t);
    81         printf("%lld
    ", ans.det[0][1]);
    82     }
    83     return 0;
    84 }
    View Code

    3 HDU 1757 A Simple Math Problem

    4 HDU 2157 How many ways??

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 #include <bitset>
    15 
    16 using namespace std;
    17 
    18 #define REP(i, n) for (int i = 0; i < (n); ++i)
    19 #define eps 1e-9
    20 
    21 typedef long long ll;
    22 typedef pair<int, int> pii;
    23 
    24 const int INF = 0x7fffffff;
    25 struct Matrix { ll det[20][20]; };
    26 const int mod = 1000;
    27 Matrix mat_t, mat, ans;
    28 int n, m, q, a, b, k;
    29 
    30 Matrix mul(Matrix x, Matrix y) {
    31     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    32     for (int i = 0; i < n; ++i) {
    33         for (int k = 0; k < n; ++k) {
    34           if (x.det[i][k] == 0) { continue; }
    35             for (int j = 0; j < n; ++j) {
    36                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    37             }
    38         }
    39     }
    40     return ret;
    41 }
    42 void solve(ll x) {
    43     mat = ans = mat_t;
    44     while (x) {
    45         if (x & 1) { ans = mul(mat, ans); }
    46         mat = mul(mat, mat); x >>= 1;
    47     }
    48 }
    49 
    50 int main() {
    51 #ifdef __AiR_H
    52     freopen("in.txt", "r", stdin);
    53 //    freopen("out.txt", "w", stdout);
    54 #endif // __AiR_H
    55     while (scanf("%d %d", &n, &m) != EOF) {
    56         if (!n && !m) { break; } memset(mat_t.det, 0, sizeof(mat_t.det));
    57         for (int i = 0; i < m; ++i) {
    58             scanf("%d %d", &a, &b); mat_t.det[a][b] = 1;
    59         }
    60         scanf("%d", &q);
    61         while (q--) {
    62             scanf("%d %d %d", &a, &b, &k);
    63             if (k == 0 && a != b) { printf("0
    "); continue; }
    64             if (k == 0) { printf("1
    "); continue; }
    65             solve(k - 1); printf("%d
    ", ans.det[a][b]);
    66         }
    67     }
    68     return 0;
    69 }
    View Code

    5 HDU 2254 奥运

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 const int maxn = 1e4;
    26 const int mod = 2008;
    27 struct Matrix { int det[30][30]; };
    28 Matrix mat_t;
    29 Matrix mat[maxn];
    30 vector<ll> v;
    31 ll p1[maxn], p2[maxn];
    32 int n, q, t1, t2, id1, id2, ans;
    33 ll v1, v2;
    34 
    35 Matrix mul(Matrix x, Matrix y) {
    36     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    37     for (int i = 0; i < 30; ++i) {
    38         for (int k = 0; k < 30; ++k) {
    39           if (x.det[i][k] == 0) { continue; }
    40             for (int j = 0; j < 30; ++j) {
    41                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    42             }
    43         }
    44     }
    45     return ret;
    46 }
    47 int get_id(ll x) {
    48     int ret = lower_bound(v.begin(), v.end(), x) - v.begin();
    49     if (ret == (int)v.size() || v[ret] != x) { return -1; } return ret;
    50 }
    51 
    52 int main() {
    53 #ifdef __AiR_H
    54     freopen("in.txt", "r", stdin);
    55 //    freopen("out.txt", "w", stdout);
    56 #endif // __AiR_H
    57     while (scanf("%d", &n) != EOF) {
    58         v.clear();
    59         for (int i = 0; i < n; ++i) {
    60             scanf("%lld %lld", &p1[i], &p2[i]);
    61             v.push_back(p1[i]); v.push_back(p2[i]);
    62         }
    63         sort(v.begin(), v.end());
    64         v.erase(unique(v.begin(), v.end()), v.end());
    65         memset(mat_t.det, 0, sizeof(mat_t.det));
    66         for (int i = 0; i < n; ++i) {
    67             id1 = get_id(p1[i]); id2 = get_id(p2[i]);
    68             ++mat_t.det[id1][id2];
    69         }
    70         mat[1] = mat_t;
    71         for (int i = 2; i < maxn; ++i) { mat[i] = mul(mat[i - 1], mat_t); }
    72         scanf("%d", &q);
    73         while (q--) {
    74             scanf("%lld %lld %d %d", &v1, &v2, &t1, &t2);
    75             id1 = get_id(v1); id2 = get_id(v2);
    76             if (id1 == -1 || id2 == -1) { printf("0
    "); continue; }
    77             ans = 0;
    78             for (int i = t1; i <= t2; ++i) {
    79                 if (i == 0) { continue; }
    80                 ans += mat[i].det[id1][id2]; ans %= mod;
    81             }
    82             printf("%d
    ", ans);
    83         }
    84     }
    85     return 0;
    86 }
    View Code

    6 HDU 2256 Problem of Precision

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 #include <ext/rope>
    15 
    16 using namespace std;
    17 using namespace __gnu_cxx;
    18 
    19 #define REP(i, n) for (int i = 0; i < (n); ++i)
    20 #define eps 1e-9
    21 #define SZ(x) ((int)x.size())
    22 #define PI acos(-1.0)
    23 
    24 typedef long long ll;
    25 typedef pair<int, int> pii;
    26 const ll mod = 1024;
    27 
    28 struct Matrix { ll det[2][2]; };
    29 Matrix ans, mat;
    30 int T, n;
    31 
    32 Matrix mul(Matrix x, Matrix y) {
    33     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    34     for (int i = 0; i < 2; ++i) {
    35         for (int k = 0; k < 2; ++k) {
    36           if (x.det[i][k] == 0) { continue; }
    37             for (int j = 0; j < 2; ++j) {
    38                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    39             }
    40         }
    41     }
    42     return ret;
    43 }
    44 void solve(ll x) {
    45     while (x) {
    46         if (x & 1) { ans = mul(mat, ans); }
    47         mat = mul(mat, mat); x >>= 1;
    48     }
    49 }
    50 
    51 int main() {
    52 #ifdef __AiR_H
    53     freopen("in.txt", "r", stdin);
    54 //    freopen("out.txt", "w", stdout);
    55 #endif // __AiR_H
    56     scanf("%d", &T);
    57     while (T--) {
    58         scanf("%d", &n);
    59         if (n == 1) { printf("9
    "); continue; }
    60         ans.det[0][0] = 5; ans.det[1][0] = 2;
    61         mat.det[0][0] = 5; mat.det[0][1] = 12;
    62         mat.det[1][0] = 2; mat.det[1][1] = 5;
    63         solve(n - 1); ans.det[0][0] *= 2; --ans.det[0][0];
    64         ans.det[0][0] %= mod;
    65         if (ans.det[0][0] < 0) { ans.det[0][0] += mod; }
    66         printf("%d
    ", ans.det[0][0]);
    67     }
    68     return 0;
    69 }
    View Code

    7 HDU 2276 Kiki & Little Kiki 2

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 const int maxn = 110;
    26 const int mod = 2;
    27 struct Matrix { int det[100][100]; };
    28 Matrix ans, mat;
    29 int n, m;
    30 char s[maxn];
    31 
    32 Matrix mul(Matrix x, Matrix y) {
    33     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    34     for (int i = 0; i < n; ++i) {
    35         for (int k = 0; k < n; ++k) {
    36           if (x.det[i][k] == 0) { continue; }
    37             for (int j = 0; j < n; ++j) {
    38                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    39             }
    40         }
    41     }
    42     return ret;
    43 }
    44 void solve(ll x) {
    45     while (x) {
    46         if (x & 1) { ans = mul(mat, ans); }
    47         mat = mul(mat, mat); x >>= 1;
    48     }
    49 }
    50 
    51 int main() {
    52 #ifdef __AiR_H
    53     freopen("in.txt", "r", stdin);
    54 //    freopen("out.txt", "w", stdout);
    55 #endif // __AiR_H
    56     while (scanf("%d %s", &m, s) != EOF) {
    57         n = strlen(s); memset(ans.det, 0, sizeof(ans.det));
    58         for (int i = 0; i < n; ++i) {
    59             if (s[i] == '1') { ans.det[i][0] = 1; }
    60         }
    61         memset(mat.det, 0, sizeof(mat.det));
    62         mat.det[0][0] = mat.det[0][n - 1] = 1;
    63         for (int i = 1; i < n; ++i) {
    64             mat.det[i][i] = mat.det[i][i - 1] = 1;
    65         }
    66         solve(m);
    67         for (int i = 0; i < n; ++i) {
    68             printf(i == n - 1 ? "%d
    " : "%d", ans.det[i][0]);
    69         }
    70     }
    71     return 0;
    72 }
    View Code

    8 HDU 2604 Queuing

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 int n, mod;
    26 struct Matrix { ll det[4][4]; };
    27 Matrix ans, mat;
    28 
    29 Matrix mul(Matrix x, Matrix y) {
    30     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    31     for (int i = 0; i < 4; ++i) {
    32         for (int k = 0; k < 4; ++k) {
    33           if (x.det[i][k] == 0) { continue; }
    34             for (int j = 0; j < 4; ++j) {
    35                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    36             }
    37         }
    38     }
    39     return ret;
    40 }
    41 void solve(ll x) {
    42     while (x) {
    43         if (x & 1) { ans = mul(mat, ans); }
    44         mat = mul(mat, mat); x >>= 1;
    45     }
    46 }
    47 
    48 int main() {
    49 #ifdef __AiR_H
    50     freopen("in.txt", "r", stdin);
    51 //    freopen("out.txt", "w", stdout);
    52 #endif // __AiR_H
    53     while (scanf("%d %d", &n, &mod) != EOF) {
    54         if (n == 0) { printf("0
    "); continue; }
    55         if (n == 1) { printf("%d
    ", 2 % mod); continue; }
    56         if (n == 2) { printf("%d
    ", 4 % mod); continue; }
    57         if (n == 3) { printf("%d
    ", 6 % mod); continue; }
    58         ans.det[0][0] = 6; ans.det[1][0] = 4;
    59         ans.det[2][0] = 2; ans.det[3][0] = 1;
    60         memset(mat.det, 0, sizeof(mat.det));
    61         mat.det[0][0] = mat.det[0][2] = mat.det[0][3] = 1;
    62         mat.det[1][0] = mat.det[2][1] = mat.det[3][2] = 1;
    63         solve(n - 3); printf("%d
    ", ans.det[0][0]);
    64     }
    65     return 0;
    66 }
    View Code

    9 HDU 2855 Fibonacci Check-up

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 struct Matrix { ll det[2][2]; };
    26 Matrix mat, ans;
    27 int T, n, mod;
    28 
    29 Matrix mul(Matrix x, Matrix y) {
    30     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    31     for (int i = 0; i < 2; ++i) {
    32         for (int k = 0; k < 2; ++k) {
    33           if (x.det[i][k] == 0) { continue; }
    34             for (int j = 0; j < 2; ++j) {
    35                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    36             }
    37         }
    38     }
    39     return ret;
    40 }
    41 void solve(ll x) {
    42     while (x) {
    43         if (x & 1) { ans = mul(mat, ans); }
    44         mat = mul(mat, mat); x >>= 1;
    45     }
    46 }
    47 
    48 int main() {
    49 #ifdef __AiR_H
    50     freopen("in.txt", "r", stdin);
    51 //    freopen("out.txt", "w", stdout);
    52 #endif // __AiR_H
    53     scanf("%d", &T);
    54     while (T--) {
    55         scanf("%d %d", &n, &mod); mat.det[1][1] = 2;
    56         mat.det[0][0] = mat.det[0][1] = mat.det[1][0] = 1;
    57         ans.det[0][0] = ans.det[1][1] = 1;
    58         ans.det[0][1] = ans.det[1][0] = 0;
    59         solve(n); printf("%lld
    ", ans.det[0][1]);
    60     }
    61     return 0;
    62 }
    View Code

    10 HDU 3117 Fibonacci Numbers

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 const int maxn = 40;
    26 const ll mod = 1e4;
    27 const double k = (sqrt(5.0) + 1.0) / 2.0;
    28 int n;
    29 int f[maxn];
    30 struct Matrix { ll det[4][4]; };
    31 Matrix ans_t, mat_t;
    32 
    33 Matrix mul(Matrix x, Matrix y) {
    34     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    35     for (int i = 0; i < 4; ++i) {
    36         for (int k = 0; k < 4; ++k) {
    37           if (x.det[i][k] == 0) { continue; }
    38             for (int j = 0; j < 4; ++j) {
    39                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    40             }
    41         }
    42     }
    43     return ret;
    44 }
    45 void solve(ll x) {
    46     while (x) {
    47         if (x & 1) { ans_t = mul(mat_t, ans_t); }
    48         mat_t = mul(mat_t, mat_t); x >>= 1;
    49     }
    50 }
    51 
    52 int main() {
    53 #ifdef __AiR_H
    54     freopen("in.txt", "r", stdin);
    55 //    freopen("out.txt", "w", stdout);
    56 #endif // __AiR_H
    57     f[0] = 0; f[1] = 1;
    58     for (int i = 2; i < maxn; ++i) {
    59         f[i] = f[i - 1] + f[i - 2];
    60     }
    61     while (scanf("%d", &n) != EOF) {
    62         if (n < maxn) { printf("%d
    ", f[n]); continue; }
    63         double ans = -0.5 * log10(5.0) + 1.0 * n * log10(k);
    64         ans = ans - floor(ans); ans = pow(10.0, ans);
    65         while (ans < 1000.0) { ans *= 10.0; }
    66         printf("%d...", (int)ans);
    67         ans_t.det[0][0] = 1; ans_t.det[1][0] = 0;
    68         mat_t.det[0][0] = mat_t.det[0][1] = 1;
    69         mat_t.det[1][0] = 1; mat_t.det[1][1] = 0;
    70         solve(n - 1); printf("%04lld
    ", ans_t.det[0][0]);
    71     }
    72     return 0;
    73 }
    View Code

    11 HDU 3306 Another kind of Fibonacci

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 const ll mod = 1e4 + 7;
    26 struct Matrix { ll det[4][4]; };
    27 Matrix mat, ans;
    28 ll n, x, y;
    29 
    30 Matrix mul(Matrix x, Matrix y) {
    31     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    32     for (int i = 0; i < 4; ++i) {
    33         for (int k = 0; k < 4; ++k) {
    34           if (x.det[i][k] == 0) { continue; }
    35             for (int j = 0; j < 4; ++j) {
    36                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    37             }
    38         }
    39     }
    40     return ret;
    41 }
    42 void solve(ll x) {
    43     while (x) {
    44         if (x & 1) { ans = mul(mat, ans); }
    45         mat = mul(mat, mat); x >>= 1;
    46     }
    47 }
    48 
    49 int main() {
    50 #ifdef __AiR_H
    51     freopen("in.txt", "r", stdin);
    52 //    freopen("out.txt", "w", stdout);
    53 #endif // __AiR_H
    54     while (scanf("%lld %lld %lld", &n, &x, &y) != EOF) {
    55         memset(mat.det, 0, sizeof(mat.det)); x %= mod; y %= mod;
    56         mat.det[0][0] = mat.det[2][1] = 1;
    57         mat.det[0][1] = mat.det[1][1] = (x * x) % mod;
    58         mat.det[0][2] = mat.det[1][2] = (y * y) % mod;
    59         mat.det[0][3] = mat.det[1][3] = (2 * x * y) % mod;
    60         mat.det[3][1] = x; mat.det[3][3] = y;
    61         ans.det[0][0] = 2;
    62         for (int i = 1; i < 4; ++i) { ans.det[i][0] = 1; }
    63         solve(n - 1); printf("%lld
    ", ans.det[0][0]);
    64     }
    65     return 0;
    66 }
    View Code

    12 HDU 4565 So Easy!

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 #include <ext/rope>
    15 
    16 using namespace std;
    17 using namespace __gnu_cxx;
    18 
    19 #define REP(i, n) for (int i = 0; i < (n); ++i)
    20 #define eps 1e-9
    21 #define SZ(x) ((int)x.size())
    22 #define PI acos(-1.0)
    23 
    24 typedef long long ll;
    25 typedef pair<int, int> pii;
    26 
    27 struct Matrix { ll det[2][2]; };
    28 Matrix ans, mat;
    29 ll a, b, n, mod;
    30 
    31 Matrix mul(Matrix x, Matrix y) {
    32     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    33     for (int i = 0; i < 2; ++i) {
    34         for (int k = 0; k < 2; ++k) {
    35           if (x.det[i][k] == 0) { continue; }
    36             for (int j = 0; j < 2; ++j) {
    37                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    38             }
    39         }
    40     }
    41     return ret;
    42 }
    43 void solve(ll x) {
    44     while (x) {
    45         if (x & 1) { ans = mul(mat, ans); }
    46         mat = mul(mat, mat); x >>= 1;
    47     }
    48 }
    49 
    50 int main() {
    51 #ifdef __AiR_H
    52     freopen("in.txt", "r", stdin);
    53 //    freopen("out.txt", "w", stdout);
    54 #endif // __AiR_H
    55     while (scanf("%lld %lld %lld %lld", &a, &b, &n, &mod) != EOF) {
    56         if (n == 1) { printf("%lld
    ", (2 * a) % mod); continue; }
    57         ans.det[0][0] = a; ans.det[1][0] = 1;
    58         mat.det[0][0] = a; mat.det[0][1] = b;
    59         mat.det[1][0] = 1; mat.det[1][1] = a;
    60         solve(n - 1); ans.det[0][0] *= 2;  ans.det[0][0] %= mod;
    61         printf("%d
    ", ans.det[0][0]);
    62     }
    63     return 0;
    64 }
    View Code

    13 HDU 5950 Recursive sequence

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 #include <bitset>
    15 
    16 using namespace std;
    17 
    18 #define REP(i, n) for (int i = 0; i < (n); ++i)
    19 #define eps 1e-9
    20 
    21 typedef long long ll;
    22 typedef pair<int, int> pii;
    23 
    24 const int INF = 0x7fffffff;
    25 struct Matrix { ll det[7][7]; };
    26 const ll mod = 2147493647;
    27 Matrix mat, ans;
    28 int T;
    29 ll n, a, b;
    30 
    31 Matrix mul(Matrix x, Matrix y) {
    32     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    33     for (int i = 0; i < 7; ++i) {
    34         for (int k = 0; k < 7; ++k) {
    35           if (x.det[i][k] == 0) { continue; }
    36             for (int j = 0; j < 7; ++j) {
    37                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    38             }
    39         }
    40     }
    41     return ret;
    42 }
    43 void solve(ll x) {
    44     while (x) {
    45         if (x & 1) { ans = mul(mat, ans); }
    46         mat = mul(mat, mat); x >>= 1;
    47     }
    48 }
    49 
    50 int main() {
    51 #ifdef __AiR_H
    52     freopen("in.txt", "r", stdin);
    53 //    freopen("out.txt", "w", stdout);
    54 #endif // __AiR_H
    55     scanf("%d", &T);
    56     while (T--) {
    57         scanf("%lld %lld %lld", &n, &a, &b);
    58         if (n == 1) { printf("%lld
    ", a); continue; }
    59         if (n == 2) { printf("%lld
    ", b); continue; }
    60         ans.det[0][0] = b; ans.det[1][0] = a; ans.det[2][0] = 16;
    61         ans.det[3][0] = 8; ans.det[4][0] = 4; ans.det[5][0] = 2; ans.det[6][0] = 1;
    62         memset(mat.det, 0, sizeof(mat.det));
    63         mat.det[0][0] = 1; mat.det[0][1] = 2; mat.det[0][2] = 1; mat.det[0][3] = 4;
    64         mat.det[0][4] = 6; mat.det[0][5] = 4; mat.det[0][6] = 1; mat.det[1][0] = 1;
    65         mat.det[2][2] = 1; mat.det[2][3] = 4; mat.det[2][4] = 6; mat.det[2][5] = 4;
    66         mat.det[2][6] = 1; mat.det[3][3] = 1; mat.det[3][4] = 3; mat.det[3][5] = 3;
    67         mat.det[3][6] = 1; mat.det[4][4] = 1; mat.det[4][5] = 2; mat.det[4][6] = 1;
    68         mat.det[5][5] = 1; mat.det[5][6] = 1; mat.det[6][6] = 1;
    69         solve(n - 2); printf("%lld
    ", ans.det[0][0]);
    70     }
    71     return 0;
    72 }
    View Code

    1 POJ 3223 Matrix Power Series

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 #include <bitset>
    15 
    16 using namespace std;
    17 
    18 #define REP(i, n) for (int i = 0; i < (n); ++i)
    19 #define eps 1e-9
    20 
    21 typedef long long ll;
    22 typedef pair<int, int> pii;
    23 
    24 const int INF = 0x7fffffff;
    25 
    26 struct Matrix { ll det[60][60]; };
    27 int n, k, mod;
    28 Matrix ans, mat;
    29 
    30 Matrix mul(Matrix x, Matrix y) {
    31     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    32     for (int i = 0; i < n; ++i) {
    33         for (int k = 0; k < n; ++k) {
    34           if (x.det[i][k] == 0) { continue; }
    35             for (int j = 0; j < n; ++j) {
    36                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    37             }
    38         }
    39     }
    40     return ret;
    41 }
    42 void solve(ll x) {
    43     while (x) {
    44         if (x & 1) { ans = mul(ans, mat); }
    45         mat = mul(mat, mat); x >>= 1;
    46     }
    47 }
    48 
    49 int main() {
    50 #ifdef __AiR_H
    51     freopen("in.txt", "r", stdin);
    52 //    freopen("out.txt", "w", stdout);
    53 #endif // __AiR_H
    54     scanf("%d %d %d", &n, &k, &mod);
    55     for (int i = 0; i < n; ++i) {
    56         for (int j = 0; j < n; ++j) { scanf("%lld", &mat.det[i][j]); }
    57         mat.det[i][n + i] = mat.det[n + i][n + i] = 1;
    58     }
    59     n *= 2; ++k; ans = mat;
    60     solve(k - 1); n /= 2;
    61     for (int i = 0; i < n; ++i) {
    62         --ans.det[i][n + i];
    63         if (ans.det[i][n + i] < 0) { ans.det[i][n + i] += mod; }
    64     }
    65     for (int i = 0; i < n; ++i) {
    66         for (int j = n; j < 2 * n - 1; ++j) { printf("%d ", ans.det[i][j]); }
    67         printf("%d
    ", ans.det[i][2 * n - 1]);
    68     }
    69     return 0;
    70 }
    View Code

    1 FZU 1683 纪念SlingShot

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 const ll mod = 2009;
    26 int n, Case = 0, T;
    27 struct Matrix { ll det[4][4]; };
    28 Matrix ans, mat;
    29 
    30 Matrix mul(Matrix x, Matrix y) {
    31     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    32     for (int i = 0; i < 4; ++i) {
    33         for (int k = 0; k < 4; ++k) {
    34           if (x.det[i][k] == 0) { continue; }
    35             for (int j = 0; j < 4; ++j) {
    36                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    37             }
    38         }
    39     }
    40     return ret;
    41 }
    42 void solve(ll x) {
    43     while (x) {
    44         if (x & 1) { ans = mul(mat, ans); }
    45         mat = mul(mat, mat); x >>= 1;
    46     }
    47 }
    48 
    49 int main() {
    50 #ifdef __AiR_H
    51     freopen("in.txt", "r", stdin);
    52 //    freopen("out.txt", "w", stdout);
    53 #endif // __AiR_H
    54     scanf("%d", &T);
    55     while (T--) {
    56         scanf("%d", &n); printf("Case %d: ", ++Case);
    57         if (n == 0) { printf("1
    "); continue; }
    58         if (n == 1) { printf("4
    "); continue; }
    59         if (n == 2) { printf("9
    "); continue; }
    60         ans.det[0][0] = 9; ans.det[1][0] = 5;
    61         ans.det[2][0] = 3; ans.det[3][0] = 1;
    62         memset(mat.det, 0, sizeof(mat.det));
    63         mat.det[0][0] = mat.det[2][1] = mat.det[3][2] = 1;
    64         mat.det[0][1] = mat.det[1][1] = 3;
    65         mat.det[0][2] = mat.det[1][2] = 2;
    66         mat.det[0][3] = mat.det[1][3] = 7;
    67         solve(n - 2); printf("%lld
    ", ans.det[0][0]);
    68     }
    69     return 0;
    70 }
    View Code

    2 FZU 1692 Key problem

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 const int maxn = 110;
    26 struct Matrix { ll det[100][100]; };
    27 Matrix mat, unit;
    28 int T, n, m, l, r, mod;
    29 ll ans[maxn], a[maxn];
    30 
    31 Matrix mul(Matrix x, Matrix y) {
    32     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    33     for (int k = 0; k < n; ++k) {
    34         for (int j = 0; j < n; ++j) {
    35             ret.det[0][j] = (ret.det[0][j] + x.det[0][k] * y.det[k][j]) % mod;
    36         }
    37     }
    38     for (int i = 1; i < n; ++i) {
    39         ret.det[i][0] = ret.det[i - 1][n - 1];
    40         for (int j = 1; j < n; ++j) {
    41             ret.det[i][j] = ret.det[i - 1][j - 1];
    42         }
    43     }
    44     return ret;
    45 }
    46 void solve(ll x) {
    47     while (x) {
    48         if (x & 1) { unit = mul(mat, unit); }
    49         mat = mul(mat, mat); x >>= 1;
    50     }
    51 }
    52 
    53 int main() {
    54 #ifdef __AiR_H
    55     freopen("in.txt", "r", stdin);
    56 //    freopen("out.txt", "w", stdout);
    57 #endif // __AiR_H
    58     scanf("%d", &T);
    59     while (T--) {
    60         scanf("%d %d %d %d %d", &n, &m, &l, &r, &mod);
    61         for (int i = 0; i < n; ++i) { scanf("%lld", &a[i]); }
    62         memset(unit.det, 0, sizeof(unit.det));
    63         for (int i = 0; i < n; ++i) { unit.det[i][i] = 1; }
    64         memset(mat.det, 0, sizeof(mat.det));
    65         for (int i = 0; i < n; ++i) {
    66             mat.det[i][i] = 1;
    67             mat.det[i][(i + n - 1) % n] = r;
    68             mat.det[i][(i + 1) % n] = l;
    69         }
    70         solve(m); memset(ans, 0, sizeof(ans));
    71         for (int i = 0; i < n; ++i) {
    72             for (int j = 0; j < n; ++j) {
    73                 ans[i] += a[j] * unit.det[i][j]; ans[i] %= mod;
    74             }
    75         }
    76         for (int i = 0; i < n; ++i) {
    77             printf(i == n - 1 ? "%lld
    " : "%lld ", ans[i]);
    78         }
    79     }
    80     return 0;
    81 }
    View Code

    1 Codeforces 185A Plant

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 const ll mod = 1e9 + 7;
    26 struct Matrix { ll det[2][2]; };
    27 Matrix mat, ans;
    28 ll n;
    29 
    30 Matrix mul(Matrix x, Matrix y) {
    31     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    32     for (int i = 0; i < 2; ++i) {
    33         for (int k = 0; k < 2; ++k) {
    34           if (x.det[i][k] == 0) { continue; }
    35             for (int j = 0; j < 2; ++j) {
    36                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    37             }
    38         }
    39     }
    40     return ret;
    41 }
    42 void solve(ll x) {
    43     while (x) {
    44         if (x & 1) { ans = mul(mat, ans); }
    45         mat = mul(mat, mat); x >>= 1;
    46     }
    47 }
    48 
    49 int main() {
    50 #ifdef __AiR_H
    51     freopen("in.txt", "r", stdin);
    52 //    freopen("out.txt", "w", stdout);
    53 #endif // __AiR_H
    54     mat.det[0][0] = mat.det[1][1] = 3;
    55     mat.det[0][1] = mat.det[1][0] = 1;
    56     ans.det[0][0] = 1; scanf("%lld", &n);
    57     solve(n); printf("%lld
    ", ans.det[0][0]);
    58     return 0;
    59 }
    View Code

    2 Codeforces 450B Jzzhu and Sequences

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 const ll mod = 1e9 + 7;
    26 struct Matrix { ll det[2][2]; };
    27 Matrix ans, mat;
    28 ll n, x, y;
    29 
    30 Matrix mul(Matrix x, Matrix y) {
    31     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    32     for (int i = 0; i < 2; ++i) {
    33         for (int k = 0; k < 2; ++k) {
    34           if (x.det[i][k] == 0) { continue; }
    35             for (int j = 0; j < 2; ++j) {
    36                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    37             }
    38         }
    39     }
    40     return ret;
    41 }
    42 void solve(ll x) {
    43     while (x) {
    44         if (x & 1) { ans = mul(mat, ans); }
    45         mat = mul(mat, mat); x >>= 1;
    46     }
    47 }
    48 
    49 int main() {
    50 #ifdef __AiR_H
    51     freopen("in.txt", "r", stdin);
    52 //    freopen("out.txt", "w", stdout);
    53 #endif // __AiR_H
    54     scanf("%lld %lld %lld", &x, &y, &n);
    55     x = (x + mod) % mod; y = (y + mod) % mod;
    56     if (n == 1) { printf("%lld
    ", x); return 0; }
    57     if (n == 2) { printf("%lld
    ", y); return 0; }
    58     ans.det[0][0] = y; ans.det[1][0] = x;
    59     mat.det[0][0] = mat.det[1][0] = 1;
    60     mat.det[0][1] = -1;
    61     solve(n - 2); if (ans.det[0][0] < 0) { ans.det[0][0] += mod; }
    62     printf("%lld
    ", ans.det[0][0]);
    63     return 0;
    64 }
    View Code

    3 Codeforces 691E Xor-sequences

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 const ll mod = 1e9 + 7;
    26 const int maxn = 110;
    27 struct Matrix { ll det[100][100]; };
    28 Matrix ans, mat;
    29 int n;
    30 ll k;
    31 ll a[maxn];
    32 int cnt[maxn];
    33 
    34 Matrix mul(Matrix x, Matrix y) {
    35     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    36     for (int i = 0; i < n; ++i) {
    37         for (int k = 0; k < n; ++k) {
    38           if (x.det[i][k] == 0) { continue; }
    39             for (int j = 0; j < n; ++j) {
    40                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    41             }
    42         }
    43     }
    44     return ret;
    45 }
    46 void solve(ll x) {
    47     while (x) {
    48         if (x & 1) { ans = mul(mat, ans); }
    49         mat = mul(mat, mat); x >>= 1;
    50     }
    51 }
    52 
    53 int main() {
    54 #ifdef __AiR_H
    55     freopen("in.txt", "r", stdin);
    56 //    freopen("out.txt", "w", stdout);
    57 #endif // __AiR_H
    58     scanf("%d %lld", &n, &k);
    59     for (int i = 0; i < n; ++i) { scanf("%lld", &a[i]); }
    60     for (int i = 0; i < n; ++i) {
    61         for (int j = 0; j < n; ++j) {
    62             if (__builtin_popcountll(a[i] ^ a[j]) % 3 == 0) { mat.det[i][j] = 1; ++cnt[i]; }
    63         }
    64     }
    65     for (int i = 0; i < n; ++i) { ans.det[i][0] = 1; }
    66     solve(k - 1); ll ret = 0;
    67     for (int i = 0; i < n; ++i) { ret += ans.det[i][0]; ret %= mod; }
    68     printf("%lld
    ", ret);
    69     return 0;
    70 }
    View Code

    4 Codeforces 852B Neural Network country

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cstdlib>
     5 #include <algorithm>
     6 #include <queue>
     7 #include <vector>
     8 #include <stack>
     9 #include <map>
    10 #include <set>
    11 #include <cmath>
    12 #include <cctype>
    13 #include <ctime>
    14 
    15 using namespace std;
    16 
    17 #define REP(i, n) for (int i = 0; i < (n); ++i)
    18 #define eps 1e-9
    19 #define SZ(x) ((int)x.size())
    20 #define PI acos(-1.0)
    21 
    22 typedef long long ll;
    23 typedef unsigned long long ull;
    24 typedef pair<int, int> pii;
    25 const ll mod = 1e9 + 7;
    26 const int maxn = 1e6 + 10;
    27 struct Matrix { ll det[100][100]; };
    28 int n, l, m;
    29 Matrix ans, mat;
    30 int cnt[maxn], a[3][maxn];
    31 
    32 Matrix mul(Matrix x, Matrix y) {
    33     Matrix ret; memset(ret.det, 0, sizeof(ret.det));
    34     for (int i = 0; i < m; ++i) {
    35         for (int k = 0; k < m; ++k) {
    36           if (x.det[i][k] == 0) { continue; }
    37             for (int j = 0; j < m; ++j) {
    38                 ret.det[i][j] = (ret.det[i][j] + x.det[i][k] * y.det[k][j]) % mod;
    39             }
    40         }
    41     }
    42     return ret;
    43 }
    44 void solve(ll x) {
    45     while (x) {
    46         if (x & 1) { ans = mul(mat, ans); }
    47         mat = mul(mat, mat); x >>= 1;
    48     }
    49 }
    50 void cal() {
    51     memset(mat.det, 0, sizeof(mat.det));
    52     for (int i = 0; i < m; ++i) {
    53         for (int j = 0; j < m; ++j) {
    54             mat.det[i][j] = cnt[(m + i - j) % m];
    55         }
    56     }
    57 }
    58 
    59 int main() {
    60 #ifdef __AiR_H
    61     freopen("in.txt", "r", stdin);
    62 //    freopen("out.txt", "w", stdout);
    63 #endif // __AiR_H
    64     scanf("%d %d %d", &n, &l, &m);
    65     for (int i = 0; i < 3; ++i) {
    66         for (int j = 0; j < n; ++j) { scanf("%d", &a[i][j]); }
    67     }
    68     memset(cnt, 0, sizeof(cnt));
    69     for (int i = 0; i < n; ++i) { ++cnt[a[0][i]]; }
    70     for (int i = 0; i < m; ++i) { ans.det[i][0] = cnt[(i + 1) % m]; }
    71     memset(cnt, 0, sizeof(cnt));
    72     for (int i = 0; i < n; ++i) { ++cnt[a[1][i]]; } cal();
    73     solve(l - 2); memset(cnt, 0, sizeof(cnt));
    74     for (int i = 0; i < n; ++i) { ++cnt[(a[1][i] + a[2][i]) % m]; }
    75     cal(); ans = mul(mat, ans); printf("%lld
    ", ans.det[m - 1][0]);
    76     return 0;
    77 }
    View Code

  • 相关阅读:
    cshtml常用标签
    模板方法模式(Template Method)
    day10-python-协程异步IORabbitMQ队列 edis缓存
    Gitlab+Jenkins自动化部署
    day9-python-进程、线程和协程
    day8-python-socket编程
    day7-python-面向对象进程进阶
    day6-python-面向对象
    day5-python-常用模块
    zabbix监控rabbitmq
  • 原文地址:https://www.cnblogs.com/zhaoyz/p/7654379.html
Copyright © 2020-2023  润新知