問題一覧 > 通常問題

No.1901 bitwise xor convolution (characteristic 2)

レベル : / 実行時間制限 : 1ケース 4.000秒 / メモリ制限 : 512 MB / 標準ジャッジ問題
タグ : / 解いたユーザー数 10
作問者 : noshi91noshi91 / テスター : akakimidoriakakimidori
3 ProblemId : 8004 / 自分の提出
問題文最終更新日: 2022-04-08 02:34:30

問題文

整数を係数とする多項式から成る列 $(A_0, A_1, \dots, A_{2^n - 1}), (B_0, B_1, \dots, B_{2^n - 1})$ が与えられます。 $$C_k := \left( \sum_{i \oplus j = k} A_i B_j \right) \bmod 2$$ で定義される列 $(C_0, C_1, \dots, C_{2^n - 1})$ を計算してください。 ただし $\oplus$ は bitwise xor を表します。

補足

整数を bit の列と解釈して $\bmod 2$ での畳み込みを行ったものを高速に計算する命令を、少なくとも yukicoder の C++ (GCC) において使用することができます。 Rust にも同種の命令が存在するようです。

#pragma GCC target("pclmul", "sse2", "sse4.1")
#include <emmintrin.h>
#include <smmintrin.h>
#include <wmmintrin.h>

__int64_t clmul(__int64_t x, __int64_t 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);
}

/*

0 <= x, y < 2**32 のとき以下のコードと同じ結果になります。

__int64_t clmul(__int64_t x, __int64_t y) {
  __int64_t z = 0;
  for (int i = 0; i < 32; i++) {
    if (y >> i & 1) {
      z ^= x << i;
    }
  }
  return z;
}

*/

入力

$n$
$a_{0, 0}~a_{0, 1}~\dots~a_{0, 31}$
$a_{1, 0}~a_{1, 1}~\dots~a_{1, 31}$
$\vdots$
$a_{2^n-1, 0}~a_{2^n-1, 1}~\dots~a_{2^n-1, 31}$
$b_{0, 0}~b_{0, 1}~\dots~b_{0, 31}$
$b_{1, 0}~b_{1, 1}~\dots~b_{1, 31}$
$\vdots$
$b_{2^n-1, 0}~b_{2^n-1, 1}~\dots~b_{2^n-1, 31}$

この入力は $\displaystyle A_i = \sum_{j=0}^{31}a_{i, j} x^j$ であることを表します。 $B$ についても同様です。

入力制約

  • $0 \leq n \leq 17$
  • $0 \leq a_{i, j} \lt 2$
  • $0 \leq b_{i, j} \lt 2$

出力

$c_{0, 0}~c_{0, 1}~\dots~c_{0, 62}$
$c_{1, 0}~c_{1, 1}~\dots~c_{1, 62}$
$\vdots$
$c_{2^n-1, 0}~c_{2^n-1, 1}~\dots~c_{2^n-1, 62}$

$\displaystyle C_i = \sum_{j=0}^{62}c_{i,j}x^j$ を満たす $c_{i,j}$ を出力してください。 最後に改行してください。

出力制約

  • $0 \leq c_{i, j} \lt 2$

サンプル

サンプル1
入力
0
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
出力
1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

サンプル2
入力
1
1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
出力
1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

サンプル3
入力
3
1 0 1 0 1 1 1 1 0 0 0 1 1 0 0 1 1 1 1 1 1 0 0 0 1 1 0 1 0 1 0 0
0 0 1 1 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 1 1 1 1 1 1 1 1
1 0 0 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 1 0 0 1 0 0 0 1
1 1 1 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 1 0 0 0 0 0 1 1 1
0 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 0 0 1 1 1 0 1 1 0 0 1 0 0 0 0 1
0 1 0 0 1 1 0 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 1 1
0 1 1 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 0 0 0 0 1 1 0 1 0 1 0 0 1 1
0 0 0 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0
1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1
1 1 0 1 0 1 0 0 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 0 0 1 1 1 0 1 0
1 0 1 0 1 0 0 0 1 1 0 1 1 0 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 1 0 1
0 0 1 1 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 1 0 1 0 0 0 0 1 1 0 1 1
0 0 0 1 0 0 1 0 1 0 1 1 1 0 1 0 0 0 1 1 0 1 1 0 0 1 0 1 1 1 0 1
1 0 1 0 0 1 0 0 0 1 1 0 1 1 1 1 0 1 0 0 0 1 0 0 1 1 1 0 1 0 0 1
1 0 1 0 0 1 1 0 0 1 0 0 0 1 0 1 0 1 0 1 1 1 1 1 0 0 0 1 1 0 1 1
1 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1 0 1 1 0 1 0 0 0
出力
0 1 0 1 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 1 0 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 0 1
0 1 1 0 0 1 1 0 1 0 0 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 1 1 0 1 1 1 0 0 0 1 0 0 0 0 1 0 1 0 0 1 0 1 1 1 1 0 1 0 1 1 1 1 1
1 0 0 0 1 0 0 1 1 1 0 0 0 1 0 0 0 0 1 0 1 1 1 0 1 1 0 1 0 1 0 0 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0
0 1 0 0 0 0 1 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 0 0 0 1 1 0 1 0 1 1 1 1 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 1 1 1 0 1 1 1 1 0
0 0 0 1 1 1 0 0 0 1 0 0 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 1 1 0 1 1 1 1 1 0 1 1 0 1 0 1 1 0
1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 0 1 0 0 1 0 0 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0 0
0 0 1 0 1 0 1 0 0 0 1 0 1 1 1 0 0 0 0 1 1 0 1 1 0 0 0 1 0 0 0 1 0 0 1 0 1 1 1 0 1 1 1 0 0 0 1 0 1 0 0 0 0 0 0 1 1 1 1 0 0 0 1
0 1 1 1 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 0 0 0 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 1 1

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。