結果
問題 | No.147 試験監督(2) |
ユーザー | srjywrdnprkt |
提出日時 | 2022-12-24 11:29:53 |
言語 | C++17(clang) (17.0.6 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 551 ms / 2,000 ms |
コード長 | 2,462 bytes |
コンパイル時間 | 1,279 ms |
コンパイル使用メモリ | 145,128 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-04-29 04:48:44 |
合計ジャッジ時間 | 4,108 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 551 ms
5,248 KB |
testcase_01 | AC | 547 ms
5,376 KB |
testcase_02 | AC | 547 ms
5,376 KB |
testcase_03 | AC | 2 ms
5,376 KB |
ソースコード
#include <iostream> #include <vector> #include <cmath> #include <map> #include <set> #include <iomanip> #include <queue> #include <algorithm> #include <numeric> #include <deque> #include <complex> #include <cassert> using namespace std; const long long modc = 1e9+7; template<typename T> struct Kitamasa{ vector<T> a; //initial values (a_0, ..., a_K-1) vector<T> c; //coefficients (c_0, ..., c_K-1) int K; //size Kitamasa(vector<T> & _a, vector<T>& _c) : a(_a), c(_c), K((int) _a.size()){ for (int i=0; i<K; i++){ a[i] %= modc; c[i] %= modc; } } //calculate {x_0, ..., x_N} vector<T> dfs(long long N){ assert(N >= K); if (N == K) return c; vector<T> res(K); if (N & 1 || N < K*2){ vector<T> x = dfs(N-1); for (int i=0; i<K; i++) res[i] = (c[i] * x[K-1]) % modc; for (int i=1; i<K; i++) res[i] = (res[i] + x[i-1]) % modc; } else{ vector<vector<T>> x(K, vector<T>(K)); x[0] = dfs(N>>1); for (int i=1; i<K; i++){ for (int j=0; j<K; j++) x[i][j] = (c[j] * x[i-1][K-1]) % modc; for (int j=1; j<K; j++) x[i][j] = (x[i][j] + x[i-1][j-1]) % modc; } for (int i=0; i<K; i++){ for (int j=0; j<K; j++){ res[j] += (x[0][i] * x[i][j]) % modc; res[j] %= modc; } } } return res; } //calculate a_N T calc (long long N){ if (N < K) return a[N]; vector<T> x = dfs(N); T res = 0; for (int i=0; i<K; i++) res = (res + (x[i] * a[i]) % modc) % modc; return res; } }; long long mod_exp(long long b, long long e){ if (b == 0) return 0; long long ans = 1; b %= modc; while (e > 0){ if ((e & 1LL)) ans = (ans * b) % modc; e = e >> 1LL; b = (b*b) % modc; } return ans; } long long div(string &D){ long long res = 0; for (int i=0; i<D.size(); i++) res = ((res * 10) % (modc-1) + D[i]-'0') % (modc-1); return res; } int main(){ long long N, C, ans=1; string D; vector<long long> a = {1, 2}, c = {1, 1}; Kitamasa K(a, c); cin >> N; for (int i=0; i<N; i++){ cin >> C >> D; ans *= mod_exp(K.calc(C), div(D)); ans %= modc; } cout << ans << endl; return 0; }