結果
問題 | No.147 試験監督(2) |
ユーザー | 古寺いろは |
提出日時 | 2015-03-31 08:03:54 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 1,156 ms / 2,000 ms |
コード長 | 1,713 bytes |
コンパイル時間 | 1,500 ms |
コンパイル使用メモリ | 167,156 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-03 23:02:03 |
合計ジャッジ時間 | 6,467 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1,147 ms
6,816 KB |
testcase_01 | AC | 1,147 ms
6,940 KB |
testcase_02 | AC | 1,156 ms
6,944 KB |
testcase_03 | AC | 2 ms
6,940 KB |
ソースコード
#include "bits/stdc++.h" using namespace std; long long mod = (long long)1e9 + 7; vector<vector<long long>> fmatrix(int N){ vector<vector<long long>> ret(N, vector<long long>(N)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (i == j) ret[i][j] = 1; else ret[i][j] = 0; } } return ret; } vector<vector<long long>> matrixmul(vector<vector<long long>> v1, vector<vector<long long>> v2){ int N = v1.size(); vector<vector<long long>> ret(N, vector<long long>(N)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { for (int k = 0; k < N; k++) { ret[i][j] += v1[i][k] * v2[k][j]; } ret[i][j] %= mod; } } return ret; } vector<vector<long long>> matrixpowmod(vector<vector<long long>> v, long long p) { if (p == 0) return fmatrix(v.size()); if (p % 2 == 1){ return matrixmul(matrixpowmod(v, p - 1), v); } auto b = matrixpowmod(v, p / 2); return matrixmul(b, b); } long long powmod(long long a, int p){ if (p == 0) return 1; if (p % 2 == 1){ return a * powmod(a, p - 1) % mod; } long long b = powmod(a, p / 2); return b * b % mod; } int main() { int N; cin >> N; long long ans = 1; long mod = (int)1e9 + 7; for (int i = 0; i < N; i++) { long long C; string SD; cin >> C >> SD; long long D = 0; for (int i = 0; i < SD.size(); i++) { D *= 10; D += SD[i] - '0'; D %= (mod - 1); } vector<vector<long long>> v(2, vector<long long>(2)); v[0][0] = 1; v[0][1] = 1; v[1][0] = 1; v[1][1] = 0; auto v2 = matrixpowmod(v, C); if (SD.size() != 1 && D == 0) D += mod; long long mul = v2[0][0] + v2[1][0]; mul %= mod; mul = powmod(mul, D); ans *= mul; ans %= mod; } cout << ans << endl; }