結果

問題 No.147 試験監督(2)
ユーザー mayoko_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
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
}
0