結果
| 問題 |
No.147 試験監督(2)
|
| コンテスト | |
| ユーザー |
mayoko_
|
| 提出日時 | 2015-04-04 13:48:03 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 4 |
ソースコード
#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;
}
mayoko_