test/convolution/bitwise_and_convolution.test.cpp
Depends on
Code
#define PROBLEM "https://judge.yosupo.jp/problem/bitwise_and_convolution"
#include "convolution/and.hpp"
#include <atcoder/modint>
#include <bits/stdc++.h>
using Z = atcoder::modint998244353;
int main() {
std::cin.tie(0)->sync_with_stdio(0);
int N;
std::cin >> N;
std::vector<Z> A(1 << N);
for (auto i = 0; i < (1 << N); ++i) {
int x;
std::cin >> x;
A[i] = x;
}
std::vector<Z> B(1 << N);
for (auto i = 0; i < (1 << N); ++i) {
int x;
std::cin >> x;
B[i] = x;
}
auto C = and_convolution(A, B);
for (auto i = 0; i < (1 << N); ++i) {
std::cout << C[i].val() << " ";
}
}
#line 1 "test/convolution/bitwise_and_convolution.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/bitwise_and_convolution"
#line 1 "convolution/and.hpp"
#line 1 "transform/superset_mobius.hpp"
#include <bit>
#include <cassert>
#include <vector>
template <typename T> void superset_mobius_transform(std::vector<T> &g) {
assert(std::has_single_bit(g.size()));
auto n = int(std::countr_zero(g.size()));
for (auto i = 0; i < n; ++i) {
for (auto s = 0; s < (1 << n); ++s) {
if (s & (1 << i)) {
g[s ^ (1 << i)] -= g[s];
}
}
}
}
#line 1 "transform/superset_zeta.hpp"
#line 7 "transform/superset_zeta.hpp"
template <typename T> void superset_zeta_transform(std::vector<T> &f) {
assert(std::has_single_bit(f.size()));
auto n = int(std::countr_zero(f.size()));
for (auto i = 0; i < n; ++i) {
for (auto s = 0; s < (1 << n); ++s) {
if (s & (1 << i)) {
f[s ^ (1 << i)] += f[s];
}
}
}
}
#line 8 "convolution/and.hpp"
template <typename T> std::vector<T> and_convolution(std::vector<T> a, std::vector<T> b) {
assert(a.size() == b.size());
superset_zeta_transform(a);
superset_zeta_transform(b);
for (auto i = 0; i < int(a.size()); ++i) {
a[i] *= b[i];
}
superset_mobius_transform(a);
return a;
}
#line 4 "test/convolution/bitwise_and_convolution.test.cpp"
#include <atcoder/modint>
#include <bits/stdc++.h>
using Z = atcoder::modint998244353;
int main() {
std::cin.tie(0)->sync_with_stdio(0);
int N;
std::cin >> N;
std::vector<Z> A(1 << N);
for (auto i = 0; i < (1 << N); ++i) {
int x;
std::cin >> x;
A[i] = x;
}
std::vector<Z> B(1 << N);
for (auto i = 0; i < (1 << N); ++i) {
int x;
std::cin >> x;
B[i] = x;
}
auto C = and_convolution(A, B);
for (auto i = 0; i < (1 << N); ++i) {
std::cout << C[i].val() << " ";
}
}
Back to top page