結果
問題 | No.1068 #いろいろな色 / Red and Blue and more various colors (Hard) |
ユーザー |
|
提出日時 | 2020-06-12 15:55:02 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,715 ms / 3,500 ms |
コード長 | 2,311 bytes |
コンパイル時間 | 1,007 ms |
コンパイル使用メモリ | 65,528 KB |
最終ジャッジ日時 | 2025-01-11 01:50:33 |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 29 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:88:18: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 88 | int n, Q; scanf("%d%d", &n, &Q); | ~~~~~^~~~~~~~~~~~~~~~ main.cpp:91:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 91 | uint64_t a; scanf("%lu", &a); | ~~~~~^~~~~~~~~~~ main.cpp:102:19: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 102 | int pos; scanf("%d", &pos); | ~~~~~^~~~~~~~~~~~
ソースコード
#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'353M2 = 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;}