結果
問題 | No.1503 Bitwise And Convolution Twisted |
ユーザー |
![]() |
提出日時 | 2020-12-31 22:53:34 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 346 ms / 2,000 ms |
コード長 | 1,120 bytes |
コンパイル時間 | 735 ms |
コンパイル使用メモリ | 73,796 KB |
最終ジャッジ日時 | 2025-01-17 08:48:21 |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 9 |
ソースコード
#include <cstddef> #include <cstdint> #include <iostream> #include <vector> using usize = std::size_t; using i64 = std::int64_t; template <class F> void kronecker(const F f, std::vector<i64> &a) { const usize n = a.size(); for (usize w = 1; w != n; w *= 2) { for (usize k = 0; k != n; k += w * 2) { for (usize i = 0; i != w; ++i) { f(a[k + i], a[k + w + i]); } } } } static constexpr i64 MOD = 998244353; i64 mod(i64 x) { x %= MOD; if (x < 0) { x += MOD; } return x; } int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); usize N; std::cin >> N; const usize m = 1 << N; std::vector<i64> A(m), B(m); for (i64 &e : A) { std::cin >> e; } for (i64 &e : B) { std::cin >> e; } kronecker([](i64 &l, i64 &r) { l += r; }, A); kronecker([](i64 &l, i64 &r) { r -= l; }, B); std::vector<i64> C(m); for (usize i = 0; i != m; ++i) { C[i] = mod(mod(A[i]) * mod(B[i])); } kronecker([](i64 &l, i64 &r) { r += l; }, C); for (usize i = 0; i != m; ++i) { std::cout << mod(C[i]) << " \n"[i + 1 == m]; } return 0; }