canuc80k6802·3/50

Ghép cặp theo tổng khối lượng

Nộp bài trên LQDOJ

Bài 68 · FFT and NTT

Có quả táo và quả chuối; mỗi vật có trọng lượng nguyên từ đến . Với từng tổng , hãy đếm số cách chọn một quả táo và một quả chuối sao cho tổng trọng lượng bằng . Input: , dãy trọng lượng táo, dãy trọng lượng chuối. Output: đáp án.

Input

  • Dòng đầu chứa .
  • Dòng tiếp theo chứa trọng lượng của quả táo.
  • Dòng cuối chứa trọng lượng của quả chuối.

Output

  • In lần lượt số cặp có tổng .

Constraints

  • .
  • Mỗi trọng lượng thuộc .

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

6 4 5
2 5 4 5
4 1 2 5 5

Output

0 1 1 1 4 4 1 4 4 0 0

Giải thích: Ta đếm trực tiếp mọi cặp táo-chuối của mẫu rồi nhóm chúng theo tổng trọng lượng từ đến .

Lời giải tóm tắt
  • Thuật toán: Tạo A[x] là số táo nặng x, B[y] là số chuối nặng y. Tính C=A*B. Theo định nghĩa convolution,
  • Thuật toán: C[w] = sum_x A[x] B[w-x].
  • Thuật toán: Mỗi tích A[x]B[w-x] đếm mọi cặp vật có hai trọng lượng đó. In C[2]..C[2k]. Mã dùng CRT nguyên để không phụ thuộc vào modulus.
  • Chứng minh đúng: Mỗi cặp táo-chuối có tổng w thuộc đúng một hạng x+(w-x)=w; ngược lại mọi lựa chọn được đếm trong hạng tương ứng. Các nhóm rời nhau, nên tổng hệ số bằng đúng số cặp cần tìm.
  • Độ phức tạp: O(k log k+n+m) thời gian, O(k) bộ nhớ.