Hàm sinh thông thường (OGF)
Hàm sinh thường (ordinary generating function, OGF) của dãy \(a\) được định nghĩa là chuỗi lũy thừa hình thức:
\(a\) có thể là dãy hữu hạn hoặc vô hạn. Ví dụ thường gặp (giả sử \(a\) bắt đầu từ \(0\)):
- Dãy \(a=\langle 1,2,3\rangle\) có OGF là \(1+2x+3x^2\).
- Dãy \(a=\langle 1,1,1,\cdots\rangle\) có OGF là \(\sum_{n\ge 0}x^n\).
- Dãy \(a=\langle 1,2,4,8,16,\cdots\rangle\) có OGF là \(\sum_{n\ge 0}2^nx^n\).
- Dãy \(a=\langle 1,3,5,7,9,\cdots\rangle\) có OGF là \(\sum_{n\ge 0}(2n+1)x^n\).
Nói cách khác, nếu dãy \(a\) có công thức tổng quát, thì hệ số của OGF chính là công thức đó.
Phép toán cơ bản
Xét hai dãy \(a,b\) với OGF tương ứng là \(F(x),G(x)\). Khi đó
Vì vậy \(F(x)\pm G(x)\) là OGF của dãy \(\langle a_n\pm b_n\rangle\).
Xét phép nhân, tức là tích chập:
Vì vậy \(F(x)G(x)\) là OGF của dãy \(\langle \sum_{i=0}^n a_ib_{n-i} \rangle\).
Dạng đóng
Khi dùng hàm sinh, ta không luôn giữ dạng chuỗi lũy thừa hình thức mà sẽ chuyển sang dạng đóng để rút gọn.
Ví dụ dãy \(\langle 1,1,1,\cdots\rangle\) có OGF \(F(x)=\sum_{n\ge 0}x^n\), ta thấy
Giải được
Đó là dạng đóng của \(\sum_{n\ge 0}x^n\).
Xét cấp số nhân \(\langle 1,p,p^2,p^3,p^4,\cdots\rangle\) có OGF \(F(x)=\sum_{n\ge 0}p^nx^n\), ta có
Dạng đóng và dạng khai triển của cấp số nhân là phép biến đổi rất thường dùng.
Bài tập nhỏ
Hãy tìm OGF (dạng chuỗi và dạng đóng) của các dãy sau. Độ khó tăng dần.
- \(a=\langle 0,1,1,1,1,\cdots\rangle\).
- \(a=\langle 1,0,1,0,1,\cdots \rangle\).
- \(a=\langle 1,2,3,4,\cdots \rangle\).
- \(a_n=\binom{m}{n}\) (\(m\) là hằng số, \(n\ge 0\)).
- \(a_n=\binom{m+n}{n}\) (\(m\) là hằng số, \(n\ge 0\)).
Đáp án
Câu 1:
Câu 2:
Câu 3 (lấy đạo hàm):
Câu 4 (nhị thức Newton):
Câu 5:
Có thể chứng minh bằng quy nạp.
Trước hết khi \(m=0\), ta có \(F(x)=\dfrac{1}{1-x}\).
Khi \(m>0\):
Hàm sinh của dãy Fibonacci
Tiếp theo ta suy ra hàm sinh của dãy Fibonacci.
Dãy Fibonacci: \(a_0=0,a_1=1,a_n=a_{n-1}+a_{n-2}\;(n>1)\). Gọi OGF là \(F(x)\), từ truy hồi ta lập phương trình:
Giải được
Câu hỏi tiếp theo: làm sao khai triển?
Cách khai triển 1
Xem \(x+x^2\) là một khối:
Bước cuối đặt \(n=k+i+1\) và đổi thứ tự tổng. Suy ra công thức:
Đây không phải dạng liên quan tỉ lệ vàng quen thuộc.
Cách khai triển 2
Xét phương trình hệ số bất định:
Quy đồng:
So sánh hệ số, được:
Giải:
Từ khai triển cấp số nhân, ta thu được công thức:
Đây là dạng đóng khác của dãy Fibonacci.
Với đa thức \(P(x),Q(x)\), khai triển \(\dfrac{P(x)}{Q(x)}\) có thể dùng phương pháp trên. Thực tế thường tìm nghiệm của \(Q(x)\), viết mẫu dưới dạng \(\prod (1-p_ix)^{d_i}\) rồi xử lý tử.
Nếu mẫu có nghiệm bội, cần thêm phân thức. Ví dụ
khi đó
Giải được
Suy ra
Nhị thức Newton
Định nghĩa lại tổ hợp:
Lưu ý \(r\) là số phức. Khi đó với \(\alpha\in\mathbf{C}\):
Nhị thức thường là trường hợp đặc biệt của nhị thức Newton.
Hàm sinh của số Catalan
Xem Diễn giải đại số của số Catalan.
Ứng dụng
Dưới đây là một số bài mẫu về ứng dụng OGF trong OI.
Food
Food
Chọn \(n\) món từ nhiều loại, mỗi loại có ràng buộc:
- Bánh hamburger: số lượng chẵn
- Coca: 0 hoặc 1
- Đùi gà: 0,1 hoặc 2
- Nước đào: số lượng lẻ
- Gà viên: bội của 4
- Bánh bao: 0,1,2 hoặc 3
- Thịt xào khoai tây: không quá 1
- Bánh mì: bội của 3
Mỗi loại tính theo “cái”, tổng số là \(n\) tính là một phương án. Với \(n\) cho trước, hãy tính số phương án modulo \(10007\).
Đây là bài kinh điển về hàm sinh. Với một loại, gọi \(a_n\) là số cách chọn \(n\) cái và lập hàm sinh. Hai loại thì số cách là tích chập, tương ứng với tích các hàm sinh. Nhiều loại thì tương tự.
Các hàm sinh (theo số thứ tự):
- \(\displaystyle\sum_{n\ge 0}x^{2n}=\dfrac{1}{1-x^2}\).
- \(1+x\).
- \(1+x+x^2=\dfrac{1-x^3}{1-x}\).
- \(\dfrac{x}{1-x^2}\).
- \(\displaystyle \sum_{n\ge 0}x^{4n}=\dfrac{1}{1-x^4}\).
- \(1+x+x^2+x^3=\dfrac{1-x^4}{1-x}\).
- \(1+x\).
- \(\dfrac{1}{1-x^3}\).
Nhân lại:
Đổi sang dạng khai triển (dùng bài tập thứ 5):
Suy ra đáp án \(\dbinom{n+2}{n-1}=\dbinom{n+2}{3}\).
Sweet
「CEOI2004」Sweet
Có \(n\) đống kẹo. Các đống khác nhau có loại kẹo khác nhau (một đống chỉ một loại). Đống \(i\) có \(m_i\) cái. Ăn ít nhất \(a\) và không quá \(b\) cái. Hỏi số phương án.
Hai phương án khác nhau nếu tổng số kẹo khác nhau, hoặc số kẹo của một loại nào đó khác nhau.
\(n\le 10,0\le a\le b\le 10^7,m_i\le 10^6\).
Trong đống \(i\), ăn \(j\) cái (duy nhất một cách) có hàm sinh:
Tổng số ăn \(i\) cái có hàm sinh:
Cần \(\sum_{i=a}^b[x^i]G(x)\).
Vì \(n\le 10\), ta có thể triển khai \(\prod_{i=1}^n(1-x^{m_i+1})\) bằng vét cạn (tối đa \(2^n\) hạng).
Sau đó với \((1-x)^{-n}\) dùng nhị thức Newton:
Giả sử hệ số \(x^k\) trong \(\prod_{i=1}^n(1-x^{m_i+1})\) là \(c_k\). Nhân với \((1-x)^{-n}\), đóng góp vào đáp án:
Như vậy tính được trong \(O(b)\).
Độ phức tạp \(O(2^n+b)\).
Last updated on this page:, Update history
Found an error? Want to help improve? Edit this page on GitHub!
Contributors to this page:sshwy
All content on this page is provided under the terms of the CC BY-SA 4.0 and SATA license, additional terms may apply