ACM-ICPC 2018 焦作賽區網路預賽 L
阿新 • • 發佈:2018-12-10
//
#include <iostream> #include <vector> #include <cstdio> #include <string> #include <cstring> #include <map> #include <algorithm> #include <queue> #include <set> #include <cmath> #include <sstream> #include <stack> #include <fstream> #include <ctime> #pragma warning(disable:4996); #define mem(sx,sy) memset(sx,sy,sizeof(sx)) typedef long long ll; typedef unsigned long long ull; const double eps = 1e-8; const double PI = acos(-1.0); const ll llINF = 0x3f3f3f3f3f3f3f3f; const int INF = 0x3f3f3f3f; const int mod = 1e9 + 7; using namespace std; const int msize = 9; struct matrix { ll mat[msize][msize]; matrix() { mem(mat, 0); } matrix(ll m[msize][msize]) { for (int i = 0; i < msize; i++) { for (int j = 0; j < msize; j++) { mat[i][j] = m[i][j]; } } } friend matrix mul(matrix &a, matrix &b) { matrix c; for (int i = 0; i < msize; i++) { for (int j = 0; j < msize; j++) { for (int k = 0; k < msize; k++) { c.mat[i][k] += a.mat[i][j] * b.mat[j][k] % mod; c.mat[i][k] %= mod; } } } return c; } friend matrix qpow(matrix a, ll b) { matrix res; for (int i = 0; i < msize; i++) { res.mat[i][i] = 1; } while (b) { if (b & 1) { res = mul(a, res); } a = mul(a, a); b >>= 1; } return res; } }; int main() { int T; scanf("%d", &T); while (T--) { ll n; scanf("%lld", &n); if (n == 1) { printf("3\n"); } else { ll a[9][9] = { 0,1,0,0,0,0,0,1,0,//0 0,0,0,1,0,0,0,1,0,//1 0,1,0,1,0,0,0,1,0,//2 1,0,0,0,1,0,0,0,0,//3 1,0,0,0,0,0,1,0,0,//4 0,0,0,0,1,0,1,0,0,//5 0,0,1,0,0,0,0,0,1,//6 0,0,1,0,0,1,0,0,1,//7 0,0,1,0,0,1,0,0,0 //8 }; matrix aa(a); matrix mans = qpow(aa, n - 2); ll fans = 0; for (int i = 0; i < 9; i++) { for (int j = 0; j < 9; j++) { fans += mans.mat[i][j]; fans %= mod; } } printf("%lld\n", fans); } } } /* 0 mc 1mm(mmc) 7fm(fmc) 1 mm 3cm(cmm) 7fm(fmm) 2 mf 3cm(cmf) 1mm(mmf) 7fm(fmf) 3 cm 4cc(ccm) 0mc(mcm) 4 cc 0mc(mcc) 6fc(fcc) 5 cf 4cc(ccf) 6fc(fcf) 6 fc 8ff(ffc) 2mf(mfc) 7 fm 2mf(mfm) 5cf(cfm) 8ff(ffm) 8 ff 5cf(cff) 2mf(mff) */
矩陣快速冪板子
const int msize = 9; struct matrix { ll mat[msize][msize]; matrix() { mem(mat, 0); } matrix(ll m[msize][msize]) { for (int i = 0; i < msize; i++) { for (int j = 0; j < msize; j++) { mat[i][j] = m[i][j]; } } } friend matrix mul(matrix &a, matrix &b) { matrix c; for (int i = 0; i < msize; i++) { for (int j = 0; j < msize; j++) { for (int k = 0; k < msize; k++) { c.mat[i][k] += a.mat[i][j] * b.mat[j][k] % mod; c.mat[i][k] %= mod; } } } return c; } friend matrix qpow(matrix a, ll b) { matrix res; for (int i = 0; i < msize; i++) { res.mat[i][i] = 1; } while (b) { if (b & 1) { res = mul(a, res); } a = mul(a, a); b >>= 1; } return res; } };
過會再更新一個用ac自動機做的版本x