結果
問題 | No.1068 #いろいろな色 / Red and Blue and more various colors (Hard) |
ユーザー | yuppe19 😺 |
提出日時 | 2020-06-12 15:55:02 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 997 ms / 3,500 ms |
コード長 | 2,311 bytes |
コンパイル時間 | 728 ms |
コンパイル使用メモリ | 69,216 KB |
実行使用メモリ | 18,176 KB |
最終ジャッジ日時 | 2024-06-24 03:59:01 |
合計ジャッジ時間 | 20,324 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,376 KB |
testcase_02 | AC | 2 ms
5,376 KB |
testcase_03 | AC | 18 ms
5,376 KB |
testcase_04 | AC | 13 ms
5,376 KB |
testcase_05 | AC | 15 ms
5,376 KB |
testcase_06 | AC | 12 ms
5,376 KB |
testcase_07 | AC | 10 ms
5,376 KB |
testcase_08 | AC | 13 ms
5,376 KB |
testcase_09 | AC | 16 ms
5,376 KB |
testcase_10 | AC | 8 ms
5,376 KB |
testcase_11 | AC | 10 ms
5,376 KB |
testcase_12 | AC | 7 ms
5,376 KB |
testcase_13 | AC | 967 ms
18,048 KB |
testcase_14 | AC | 986 ms
18,048 KB |
testcase_15 | AC | 989 ms
18,048 KB |
testcase_16 | AC | 967 ms
18,048 KB |
testcase_17 | AC | 974 ms
18,048 KB |
testcase_18 | AC | 981 ms
18,048 KB |
testcase_19 | AC | 986 ms
18,048 KB |
testcase_20 | AC | 980 ms
18,176 KB |
testcase_21 | AC | 990 ms
18,176 KB |
testcase_22 | AC | 997 ms
18,048 KB |
testcase_23 | AC | 991 ms
18,048 KB |
testcase_24 | AC | 970 ms
18,048 KB |
testcase_25 | AC | 984 ms
18,048 KB |
testcase_26 | AC | 989 ms
18,176 KB |
testcase_27 | AC | 995 ms
18,048 KB |
testcase_28 | AC | 984 ms
18,176 KB |
testcase_29 | AC | 980 ms
18,048 KB |
testcase_30 | AC | 973 ms
18,048 KB |
testcase_31 | AC | 2 ms
5,376 KB |
ソースコード
#include <cstdint> #include <cstdio> #include <queue> #include <map> #include <vector> using namespace std; using u32 = uint32_t; constexpr u32 O = 31, N = 1U << 23, M = N * 119 + 1, // 998'244'353 M2 = M - 2; inline constexpr u32 mod_mul(uint64_t x, u32 y) { return static_cast<u32>(x * y % M); } inline constexpr u32 mod_pow(u32 a, u32 n) { u32 res = 1; for(; n; n>>=1) { if(n & 1) { res = mod_mul(res, a); } a = mod_mul(a, a); } return res; } void myfmt(vector<u32> *a, bool inv) { const u32 n = static_cast<u32>(a->size()); for(u32 H=1, W=n>>1; H<n; H<<=1, W>>=1) { vector<u32> y = *a; u32 r = mod_pow(O, N/(H*2)); if(inv) { r = mod_pow(r, M2); } u32 w = 1; for(size_t k=0; k<H; ++k) { for(size_t j=0; j<W; ++j) { u32 y0 = y[2*W*k+j], y1 = mod_mul(y[2*W*k+j+W], w); a->at(W* k +j) = y0 + y1 < M ? y0 + y1 : y0 + y1 - M; a->at(W*(k+H)+j) = y0 >= y1 ? y0 - y1 : y0 - y1 + M; } w = mod_mul(w, r); } } } void fmt(vector<u32> *a) { myfmt(a, false); } void ifmt(vector<u32> *a) { myfmt(a, true); u32 n = static_cast<u32>(a->size()); u32 inv = mod_pow(n, M2); for(size_t i=0; i<n; ++i) { a->at(i) = mod_mul(a->at(i), inv); } } vector<u32> convol(vector<u32> a, vector<u32> b) { size_t n = 1; while(n < a.size() + b.size()) { n <<= 1; } a.resize(n); b.resize(n); fmt(&a); fmt(&b); vector<u32> c(n); for(size_t i=0; i<n; ++i) { c[i] = mod_mul(a[i], b[i]); } ifmt(&c); return c; } void convol(vector<u32> *a, vector<u32> *b) { size_t n = 1; while(n < a->size() + b->size()) { n <<= 1; } a->resize(n); b->resize(n); fmt(a); fmt(b); for(size_t i=0; i<n; ++i) { a->at(i) = mod_mul(a->at(i), b->at(i)); } ifmt(a); } int main(void) { int n, Q; scanf("%d%d", &n, &Q); queue<vector<u32>> que; for(int i=0; i<n; ++i) { uint64_t a; scanf("%lu", &a); que.push({static_cast<u32>(--a % M), 1}); } while(que.size() > 1) { vector<u32> a = que.front(); que.pop(); vector<u32> b = que.front(); que.pop(); convol(&a, &b); que.emplace(a); } vector<u32> v = que.front(); for(int q=0; q<Q; ++q) { int pos; scanf("%d", &pos); printf("%u\n", v[pos]); } return 0; }