結果

問題 No.1068 #いろいろな色 / Red and Blue and more various colors (Hard)
ユーザー yuppe19 😺
提出日時 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);
      |              ~~~~~^~~~~~~~~~~~

ソースコード

diff #
プレゼンテーションモードにする

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