結果
問題 | No.147 試験監督(2) |
ユーザー | mayoko_ |
提出日時 | 2015-04-04 13:48:03 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 262 ms / 2,000 ms |
コード長 | 2,012 bytes |
コンパイル時間 | 1,370 ms |
コンパイル使用メモリ | 159,916 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-04 01:47:14 |
合計ジャッジ時間 | 3,236 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 258 ms
6,812 KB |
testcase_01 | AC | 262 ms
6,944 KB |
testcase_02 | AC | 258 ms
6,940 KB |
testcase_03 | AC | 2 ms
6,940 KB |
ソースコード
#include <bits/stdc++.h> #define rep(i, n) for (int (i) = 0; (i) < (int)(n); (i)++) const int dx[] = {1, 0, -1, 0}; const int dy[] = {0, 1, 0, -1}; using namespace std; typedef long long ll; const ll MOD = 1e9+7; const ll MM = MOD-1; ll getMod(const string& s) { int n = s.size(); ll ans = 0; for (int i = 0; i < n; i++) { ans *= 10; ans += (s[i]-'0'); ans %= MM; } return ans; } // x^p ll powmod(ll x, ll p, ll m = MOD) { if (x == 0) return 0; if (p == 0) return 1; if (p == 1) return x; if (p % 2 == 0) { ll tmp = powmod(x, p/2, m); return (tmp*tmp)%m; } else { ll tmp = powmod(x, p-1, m); return (tmp*x)%m; } } /* * a b * c d * って感じで行列になっております */ struct Matrix2x2 { ll a, b, c, d; Matrix2x2() {} Matrix2x2(ll a, ll b, ll c, ll d) : a(a), b(b), c(c), d(d) {} }; /* A*Bという行列計算 */ Matrix2x2 mult(Matrix2x2 A, Matrix2x2 B) { Matrix2x2 C; C.a = ((A.a * B.a) % MOD + (A.b * B.c) % MOD) % MOD; C.b = ((A.a * B.b) % MOD + (A.b * B.d) % MOD) % MOD; C.c = ((A.c * B.a) % MOD + (A.d * B.c) % MOD) % MOD; C.d = ((A.c * B.b) % MOD + (A.d * B.d) % MOD) % MOD; return C; } /* A^pという行列のべき乗計算 */ Matrix2x2 expt(Matrix2x2 A, ll p) { if (p == 0) { Matrix2x2 I; I.a = 1; I.b = 0; I.c = 0; I.d = 1; return I; } if (p == 1) { return A; } else if (p % 2) { Matrix2x2 T = expt(A, p-1); return mult(A, T); } else { Matrix2x2 T = expt(A, p/2); return mult(T, T); } } int main() { int N; cin >> N; ll ans = 1; Matrix2x2 A(0, 1, 1, 1); while (N--) { ll C; string D; cin >> C >> D; ll d = getMod(D); Matrix2x2 B = expt(A, C-1); ll tmp = B.c+B.d*2; tmp %= MOD; ans *= powmod(tmp, d); ans %= MOD; } cout << ans << endl; return 0; }