結果
問題 | No.541 3 x N グリッド上のサイクルの個数 |
ユーザー | pekempey |
提出日時 | 2017-06-30 23:29:24 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 1,557 bytes |
コンパイル時間 | 833 ms |
コンパイル使用メモリ | 76,624 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-04 21:36:13 |
合計ジャッジ時間 | 2,472 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 62 |
ソースコード
#include <iostream> #include <algorithm> #include <string> #include <vector> #include <array> constexpr int MOD = 1e9 + 7; struct modint { int n; modint(int n = 0) : n(n) {} }; modint operator+(modint a, modint b) { return modint((a.n += b.n) >= MOD ? a.n - MOD : a.n); } modint operator-(modint a, modint b) { return modint((a.n -= b.n) < 0 ? a.n + MOD : a.n); } modint operator*(modint a, modint b) { return modint(1LL * a.n * b.n % MOD); } modint &operator+=(modint &a, modint b) { return a = a + b; } modint &operator-=(modint &a, modint b) { return a = a - b; } modint &operator*=(modint &a, modint b) { return a = a * b; } using vec = std::array<modint, 10>; using mat = std::array<vec, 10>; mat operator*(mat a, mat b) { mat c = {}; for (int i = 0; i < 10; i++) { for (int k = 0; k < 10; k++) { for (int j = 0; j < 10; j++) { c[i][j] += a[i][k] * b[k][j]; } } } return c; } mat matpow(mat a, long long b) { mat ret = {}; for (int i = 0; i < 10; i++) { ret[i][i] = 1; } while (b > 0) { if (b % 2 == 1) { ret = ret * a; } a = a * a; b /= 2; } return ret; } int main() { std::vector<std::vector<int>> g = { {0,1,2,3,4,5,6,8}, // 0 {1,4,6,8,9}, // 1 {2,4,5,8,9}, // 2 {3,5,6,8,9}, // 3 {1,2,4,5,8,9}, // 4 {2,3,4,5,8,9}, // 5 {6,8}, // 6 {1,3,7,9}, // 7 {1,2,3,4,5,7,8,9}, // 8 {9}, // 9 }; mat A = {}; for (int i = 0; i < g.size(); i++) { for (int j : g[i]) { A[j][i] = 1; } } long long N; std::cin >> N; A = matpow(A, N + 1); std::cout << A[9][0].n << std::endl; }