canuc80k6800·1/50

Tích chập mô-đun

Nộp bài trên LQDOJ

Bài 68 · FFT and NTT

Cho hai dãy hệ số trong trường modulo . Hãy in dãy , trong đó bằng tổng qua mọi cặp chỉ số thỏa , rồi lấy modulo .

Input

  • Dòng đầu chứa hai số nguyên .
  • Dòng thứ hai chứa hệ số của đa thức thứ nhất theo bậc tăng dần.
  • Dòng thứ ba chứa hệ số của đa thức thứ hai theo bậc tăng dần.

Output

  • In hệ số của tích, theo bậc tăng dần và lấy modulo .

Constraints

  • .
  • .

Scoring

  • Subtask ( điểm): Đại lượng không vượt .
  • Subtask ( điểm): Không có ràng buộc bổ sung.

Example

Test 1

Input

2 2
12 32
33 76

Output

396 1968 2432

Giải thích: Nhân hai đa thức của mẫu và gom các tích có cùng tổng chỉ số sẽ tạo đúng dãy hệ số được in.

Lời giải tóm tắt
  • Thuật toán: 1. Xem hai dãy là hai đa thức A(x) và B(x). 2. Chọn Z là lũy thừa hai nhỏ nhất không bé hơn N+M-1; thêm các hệ số 0 đến độ dài Z. 3. NTT thuận hai mảng. Ở miền giá trị tại các căn bậc Z, tích đa thức trở thành phép nhân từng vị trí. 4. Đặt FA[t] = FA[t] * FB[t]. 5. NTT ngược, nhân mọi phần tử với Z^{-1}, rồi lấy N+M-1 phần tử đầu.
  • Thuật toán: Mã dùng modulus 998244353 = 119*2^23+1 và căn nguyên thủy 3, nên mọi độ dài lũy thừa hai đến 2^23 đều hợp lệ.
  • Chứng minh đúng: NTT là phép đánh giá đa thức tại các lũy thừa của một căn nguyên thủy. Với mỗi điểm w^t, ta có (A*B)(w^t)=A(w^t)B(w^t). NTT ngược là phép nội suy duy nhất trong trường, vì vậy dãy thu được chính là hệ số tích A(x)B(x). Việc đệm 0 ngăn tích chập vòng chồng lên phần cần lấy.
  • Độ phức tạp: Thời gian O(Z log Z), bộ nhớ O(Z), với Z = 2^ceil(log2(N+M-1)).