結果
問題 | No.613 Solitude by the window |
ユーザー |
|
提出日時 | 2017-12-13 16:34:21 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 3 ms / 2,000 ms |
コード長 | 2,881 bytes |
コンパイル時間 | 2,144 ms |
コンパイル使用メモリ | 196,456 KB |
最終ジャッジ日時 | 2025-01-05 05:12:36 |
ジャッジサーバーID (参考情報) |
judge5 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
ソースコード
#include <bits/stdc++.h>#define show(x) cerr << #x << " = " << x << endlusing namespace std;using ll = __int128_t;using ld = long double;template <typename T>ostream& operator<<(ostream& os, const vector<T>& v){os << "sz=" << v.size() << "\n[";for (const auto& p : v) {os << p << ",";}os << "]\n";return os;}template <typename T, std::size_t n>ostream& operator<<(ostream& os, const array<T, n>& v){os << "sz=" << v.size() << "\n[";for (const auto& p : v) {os << p << ",";}os << "]\n";return os;}template <typename S, typename T>ostream& operator<<(ostream& os, const pair<S, T>& p){os << "(" << p.first << "," << p.second<< ")";return os;}constexpr ll MOD = 1e9 + 7;template <typename T>constexpr T INF = numeric_limits<T>::max() / 100;ll N, M;struct Matrix {Matrix(){for (int i = 0; i < 2; i++) {for (int j = 0; j < 2; j++) {table[i][j] = 0;}}}static Matrix Unit(){Matrix ans;ans.table[0][0] = 1;ans.table[1][1] = 1;return ans;}Matrix operator*(const Matrix& mat) const{Matrix ans;for (int i = 0; i < 2; i++) {for (int j = 0; j < 2; j++) {for (int k = 0; k < 2; k++) {ans.table[i][j] += (table[i][k] * mat.table[k][j]) % M;ans.table[i][j] %= M;}}}return ans;}array<array<ll, 2>, 2> table;};ll mul(const ll p, const ll n, const ll mod) //p*n{if (n == 0) {return 0;}if (n % 2 == 1) {return (mul(p, n - 1, mod) + p) % mod;} else {const ll pp = mul(p, n / 2, mod);return (pp + pp) % mod;}}ll power(const ll n, const ll mod){if (n == 0) {return 1;}if (n % 2 == 1) {return (power(n - 1, mod) * 2) % mod;} else {const ll pp = power(n / 2, mod);return mul(pp, pp, mod);}}Matrix power(const Matrix& mat, const ll n){if (n == 0) {return Matrix::Unit();}if (n % 2 == 1) {return power(mat, n - 1) * mat;} else {const Matrix pp = power(mat, n / 2);return pp * pp;}}int main(){cin.tie(0);ios::sync_with_stdio(false);long long N_, M_;cin >> N_ >> M_;N = N_;M = M_;if (M == 1) {cout << 0 << endl;} else {Matrix mat;mat.table[0][0] = 2;mat.table[0][1] = 3;mat.table[1][0] = 1;mat.table[1][1] = 2;const ll mod = M * (M - 1) * (M + 1);const Matrix ans = power(mat, power(N, mod));cout << (long long)(2 * ans.table[0][0] + M - 2) % (long long)M << endl;}return 0;}