library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub Series-205/library

:heavy_check_mark: test/yosupo-bitwise_xor_convolution.test.cpp

Depends on

Code

#define PROBLEM "https://judge.yosupo.jp/problem/bitwise_xor_convolution"

#include <bits/stdc++.h>
using namespace std;

#include "../convolution/xor_convolution.cpp"
#include "../modint/modint.cpp"

using mint = Modint<998244353>;

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);

    int n;
    cin >> n;
    vector<mint> a(1 << n), b(1 << n);
    for(int i = 0; i < 1 << n; i++) {
        long long in;
        cin >> in;
        a[i] = in;
    }
    for(int i = 0; i < 1 << n; i++) {
        long long in;
        cin >> in;
        b[i] = in;
    }

    auto ans = xorConvolution::convolution(a, b);
    for(int i = 0; i < 1 << n; i++)
        cout << ans[i].x << " \n"[(i + 1) == 1 << n];
}
#line 1 "test/yosupo-bitwise_xor_convolution.test.cpp"
#define PROBLEM "https://judge.yosupo.jp/problem/bitwise_xor_convolution"

#include <bits/stdc++.h>
using namespace std;

#line 3 "convolution/xor_convolution.cpp"
using namespace std;

class xorConvolution {
    template <typename T>
    static void FWT(vector<T>& f) {
        int n = f.size();
        for(int i = 1; i < n; i <<= 1)
            for(int j = 0; j < n; j++)
                if((j & i) == 0) {
                    T x = f[j], y = f[j | i];
                    f[j] = x + y, f[j | i] = x - y;
                }
    }

public:
    template <typename T>
    static vector<T> convolution(vector<T> f, vector<T> g) {
        int sz = 1, n = max(f.size(), g.size());
        while(sz < n) sz <<= 1;
        f.resize(sz);
        g.resize(sz);
        FWT(f);
        FWT(g);
        for(int i = 0; i < sz; i++) f[i] *= g[i];
        FWT(f);
        for(int i = 0; i < sz; i++) f[i] /= sz;
        return f;
    }
};
#line 2 "modint/modint.cpp"

template <long long MOD>
struct Modint {
    long long x;
    Modint(long long x_ = 0) : x(x_ % MOD) {
        if(x < 0) x += MOD;
    }
    friend Modint operator+(Modint a, Modint b) { return a.x + b.x; }
    friend Modint operator-(Modint a, Modint b) { return a.x - b.x; }
    friend Modint operator*(Modint a, Modint b) { return a.x * b.x; }
    friend Modint operator/(Modint a, Modint b) { return a * b.inv(); }
    // 4 行コピペ  Alt + Shift + クリックで複数カーソル
    friend Modint& operator+=(Modint& a, Modint b) { return a = a.x + b.x; }
    friend Modint& operator-=(Modint& a, Modint b) { return a = a.x - b.x; }
    friend Modint& operator*=(Modint& a, Modint b) { return a = a.x * b.x; }
    friend Modint& operator/=(Modint& a, Modint b) { return a = a * b.inv(); }
    Modint inv() const { return pow(MOD - 2); }
    Modint pow(long long b) const {
        Modint a = *this, c = 1;
        while(b) {
            if(b & 1) c *= a;
            a *= a;
            b >>= 1;
        }
        return c;
    }
};
#line 8 "test/yosupo-bitwise_xor_convolution.test.cpp"

using mint = Modint<998244353>;

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);

    int n;
    cin >> n;
    vector<mint> a(1 << n), b(1 << n);
    for(int i = 0; i < 1 << n; i++) {
        long long in;
        cin >> in;
        a[i] = in;
    }
    for(int i = 0; i < 1 << n; i++) {
        long long in;
        cin >> in;
        b[i] = in;
    }

    auto ans = xorConvolution::convolution(a, b);
    for(int i = 0; i < 1 << n; i++)
        cout << ans[i].x << " \n"[(i + 1) == 1 << n];
}
Back to top page