結果
| 問題 |
No.147 試験監督(2)
|
| コンテスト | |
| ユーザー |
srjywrdnprkt
|
| 提出日時 | 2022-12-24 11:21:19 |
| 言語 | C++17(clang) (17.0.6 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,436 bytes |
| コンパイル時間 | 3,602 ms |
| コンパイル使用メモリ | 145,392 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-11-18 05:08:16 |
| 合計ジャッジ時間 | 5,092 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 3 WA * 1 |
ソースコード
#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){
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;
}
srjywrdnprkt