結果
| 問題 | No.1901 bitwise xor convolution (characteristic 2) |
| ユーザー |
noshi91
|
| 提出日時 | 2022-04-07 02:48:17 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
WA
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,501 bytes |
| コンパイル時間 | 3,217 ms |
| コンパイル使用メモリ | 108,468 KB |
| 最終ジャッジ日時 | 2025-01-28 15:34:33 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 WA * 2 |
| other | AC * 1 WA * 6 |
ソースコード
#pragma GCC target("sse2", "pclmul", "sse4.1")
#include <emmintrin.h>
#include <smmintrin.h>
#include <wmmintrin.h>
using i64 = __int64_t;
i64 clmul(i64 x, i64 y) {
__m128i x_ = _mm_set_epi64x(0, x);
__m128i y_ = _mm_set_epi64x(0, y);
__m128i z_ = _mm_clmulepi64_si128(x_, y_, 0);
return _mm_extract_epi64(z_, 0);
}
#include <array>
#include <iostream>
#include <vector>
static constexpr int n_max = 18;
using poly = std::array<i64, n_max + 1>;
template <class F, class T> void bitwise_transfrm(F f, std::vector<T> &a) {
const int n = a.size();
for (int w = 1; w < n; w *= 2) {
for (int k = 0; k < n; k += w * 2) {
for (int i = 0; i < w; i++) {
f(a[k + i], a[k + w + i]);
}
}
}
}
std::vector<poly> rank(const std::vector<i64> &a) {
const int n = a.size();
std::vector<poly> b(n);
for (int i = 0; i < n; i++) {
int cnt = 0;
for (int k = 0; k < n_max; k++) {
if (i >> k & 1) {
cnt++;
}
}
b[i][cnt] = a[i];
}
return b;
}
std::vector<i64> unrank(const std::vector<poly> &a) {
const int n = a.size();
std::vector<i64> b(n);
for (int i = 0; i < n; i++) {
int cnt = 0;
for (int k = 0; k < n_max; k++) {
if (i >> k & 1) {
cnt++;
}
}
b[i] = a[i][cnt];
}
return b;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin >> n;
std::vector<i64> A(1 << n, 0), B(1 << n, 0);
for (i64 &e : A) {
for (int i = 0; i <= 31; i++) {
int a;
std::cin >> a;
e |= i64(a) << i;
}
}
for (i64 &e : B) {
for (int i = 0; i <= 31; i++) {
int b;
std::cin >> b;
e |= i64(b) << i;
}
}
const auto add_sub = [](i64 &l, i64 &r) { l ^= r; };
const auto addp_sup = [](auto &l, auto &r) {
for (int i = 0; i <= n_max; i++) {
r[i] ^= l[i];
}
};
bitwise_transfrm(add_sub, A);
bitwise_transfrm(add_sub, A);
auto rA = rank(A);
auto rB = rank(B);
bitwise_transfrm(addp_sup, rA);
bitwise_transfrm(addp_sup, rB);
std::vector<poly> rC(1 << n);
for (int i = 0; i < (1 << n); i++) {
for (int j = 0; j <= n_max; j++) {
for (int k = 0; k <= n_max - j; k++) {
rC[i][j + k] ^= clmul(rA[i][j], rB[i][k]);
}
}
}
bitwise_transfrm(addp_sup, rC);
auto c = unrank(rC);
bitwise_transfrm(add_sub, c);
for (const i64 &e : c) {
for (int i = 0; i <= 62; i++) {
std::cout << (e >> i & 1) << " \n"[i == 62];
}
}
return 0;
}
noshi91