結果
問題 | No.147 試験監督(2) |
ユーザー | 古寺いろは |
提出日時 | 2015-03-31 07:59:55 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 323 ms / 2,000 ms |
コード長 | 1,864 bytes |
コンパイル時間 | 1,234 ms |
コンパイル使用メモリ | 160,920 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-03 23:01:47 |
合計ジャッジ時間 | 3,143 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 323 ms
6,812 KB |
testcase_01 | AC | 322 ms
6,940 KB |
testcase_02 | AC | 320 ms
6,944 KB |
testcase_03 | AC | 2 ms
6,944 KB |
ソースコード
#include "bits/stdc++.h" using namespace std; long long mod = (long long)1e9 + 7; long long v1[2][2]; long long v2[2][2]; long long v3[2][2]; void fmatrix(){ v3[0][0] = v3[1][1] = 1; v3[1][0] = v3[0][1] = 0; } void v3tov1(){ v1[0][0] = v3[0][0]; v1[0][1] = v3[0][1]; v1[1][0] = v3[1][0]; v1[1][1] = v3[1][1]; } void v3tov2(){ v2[0][0] = v3[0][0]; v2[0][1] = v3[0][1]; v2[1][0] = v3[1][0]; v2[1][1] = v3[1][1]; } void matrixmul(){ for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { v3[i][j] = 0; } } for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { for (int k = 0; k < 2; k++) { v3[i][j] += v1[i][k] * v2[k][j]; } v3[i][j] %= mod; } } } void matrixpowmod(long long p) { if (p == 0){ fmatrix(); } else if (p % 2 == 1){ long long temp[2][2]; temp[0][0] = v3[0][0]; temp[0][1] = v3[0][1]; temp[1][0] = v3[1][0]; temp[1][1] = v3[1][1]; matrixpowmod(p - 1); v3tov2(); v1[0][0] = temp[0][0]; v1[0][1] = temp[0][1]; v1[1][0] = temp[1][0]; v1[1][1] = temp[1][1]; matrixmul(); } else{ matrixpowmod(p / 2); v3tov1(); v3tov2(); matrixmul(); } } 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); } v3[0][0] = 1; v3[0][1] = 1; v3[1][0] = 1; v3[1][1] = 0; if (SD.size() != 1 && D == 0) D += mod; matrixpowmod(C); long long mul = v3[0][0] + v3[1][0]; mul %= mod; mul = powmod(mul, D); ans *= mul; ans %= mod; } cout << ans << endl; }