canuc80k4606·7/28

Tích Chập OR

Nộp bài trên LQDOJ

Bài 46 · SOS DP

Hai dãy và được đánh chỉ số bởi mọi mask bit. Hãy tạo dãy sao cho là tổng trên tất cả cặp có .

Input

  • Dòng đầu chứa . Dòng thứ hai chứa số của dãy theo chỉ số tăng dần. Dòng thứ ba chứa số của dãy .

Output

  • In giá trị , mỗi giá trị modulo .

Constraints

  • .
  • .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

2
1 2 3 4
5 6 7 8

Output

5 28 43 184

Giải thích: Chẳng hạn . Với mask , các cặp chỉ số có OR bằng là (0,1),(1,0),(1,1), cho .

Lời giải tóm tắt
  • Phân tích: OR-convolution trở thành phép nhân điểm sau subset zeta. Thật vậy, tổng zeta của c tại m gom mọi c[k] với k subseteq m, tương đương gom mọi cặp i,j subseteq m; tổng này bằng tích hai tổng zeta của a và b.
  • Thuật toán: Chạy subset zeta cho a và b, nhân hai giá trị tương ứng modulo 998244353, rồi chạy subset Möbius trên tích để thu c.
  • Chứng minh đúng đắn: Gọi Za[m]=sum_{i subseteq m}a[i] và tương tự. Khi nhân, Za[m]Zb[m] chứa đúng mọi cặp (i,j) có i subseteq m và j subseteq m, tức i|j subseteq m. Do đó tích này bằng sum_{k subseteq m} c[k], chính là subset zeta của OR-convolution cần tìm. Möbius đảo zeta, nên dãy cuối cùng đúng từng c[k].
  • Độ phức tạp: O(n·2^n) thời gian và O(2^n) bộ nhớ.