Tổ hợp chỉ là hoán vị mà quên mất thứ tự

Đăng ngày 18 tháng 3, 2026 ... views


Càng học về đếm, mình càng nhận ra một điều thú vị: cùng một con số cứ xuất hiện đi xuất hiện lại trong những bối cảnh hoàn toàn khác nhau. Khi đếm tập con — ta ra được một con số. Đếm chuỗi nhị phân có lượng số 1 cố định — vẫn là con số đó. Đếm đường đi trên lưới — lại thấy kết quả y hệt.

Không phải ngẫu nhiên đâu. Thực chất chúng là cùng một thứ, chỉ là đang xuất hiện dưới những dạng khác nhau thôi. Và công cụ hé lộ mối liên hệ đó chính là tổ hợp — hay "n chọn k" — một trong những biểu thức linh hoạt nhất của tổ hợp học.

Trong bài trước, mình đã đi từ đếm phần bù đến hoán vị rồi anagram. Bài này tiếp nối ngay từ đó: mình sẽ xem quy tắc thương áp dụng thế nào cho đối xứng hình học, rồi suy ra tổ hợp từ hoán vị, và cuối cùng khám phá rằng tập con, chuỗi nhị phân, và đường đi trên lưới đều được đếm bởi cùng một công thức.

Đối xứng khiến việc đếm khó hơn — và quy tắc thương giải quyết nó

Bài toán vui: bạn có bốn que màu khác nhau — đỏ, xanh dương, xanh lá, vàng — và muốn ghép thành hình vuông. Có bao nhiêu hình vuông khác nhau?

Câu trả lời phụ thuộc vào "khác nhau" nghĩa là gì. Nếu treo mỗi hình lên tường như tranh (cố định hướng), mọi cách sắp xếp đều khác nhau, tổng cộng là 4! = 24 hình.

Nhưng nếu coi chúng là vật thể vật lý — có thể cầm lên, xoay, lật — thì nhiều trong 24 "bức tranh" đó thực ra là cùng một hình vuông.

Các hình vuông bằng que màu minh họa đối xứng xoay và lật

Loading diagram...

Hình vuông có 8 hướng đối xứng: 4 phép xoay (0, 90, 180, 270 độ) nhân 2 phép lật (mặt trước và mặt sau). Mỗi hình vuông vật lý xuất hiện dưới dạng đúng 8 bức tranh khác nhau. Nên số hình thật sự khác nhau là 24 / 8 = 3.

Đây là quy tắc thương từ bài trước, áp dụng cho hình học thay vì chữ cái. Đầu tiên tính cho tập hợp dễ hơn (treo tranh), sau đó chia cho số phép đối xứng.

Cách nhìn khéo hơn

Có cách khác không cần chia. Cố định một màu — giả sử đỏ ở dưới cùng. Giờ bạn chỉ cần chọn màu đối diện (trên cùng). Có 3 lựa chọn: xanh dương, xanh lá, hoặc vàng.

Khi đã chọn trên và dưới, hai cạnh còn lại có thể hoán đổi bằng cách lật hình. Nên chúng không tạo ra hình mới. Vậy chính xác có 3 hình.

Loading diagram...

Cả hai cách cho cùng đáp án. Cách quy tắc thương có tính hệ thống hơn (và tổng quát hóa cho mọi hình), còn cách trực tiếp cần trực giác hình học hơn nhưng tránh được số lớn.

Tổng quát hóa cho hình khác

Với lục giác đều có 6 cạnh màu khác nhau, có 6 phép xoay và 2 phép lật = 12 hướng đối xứng. Số lục giác khác nhau là 6! / 12 = 720 / 12 = 60.

Quy luật: tổng số cách sắp xếp chia cho số hướng đối xứng. Áp dụng cho mọi đa giác đều khi xem nó là một vật thể thật, có thể cầm lên xoay và lật.

Bước ngoặt lớn: từ dãy sang tập con

Mọi thứ mình đã đếm trước giờ — chuỗi, hoán vị, anagram — đều liên quan đến thứ tự. Vị trí 1 quan trọng, vị trí 2 cũng vậy... Thứ tự khác nhau sẽ tạo ra dãy khác nhau.

Nhưng đôi khi thứ tự không quan trọng. Bạn chỉ quan tâm những phần tử nào được chọn, không quan tâm thứ tự sắp xếp.

Một lớp học có bảy sinh viên được tô sáng như một tập con không thứ tự

Loading diagram...

Chọn 7 người từ lớp 50 người đi chơi như một nhóm — bạn không quan tâm ai được chọn trước. Đó chỉ là một tập hợp 7 người. Đó là tổ hợp.

Chọn 7 người mà mỗi người đi một ngày khác nhau trong tuần — giờ thứ tự quan trọng (người đi ngày Thứ Hai khác với người đi ngày Thứ Ba). Đó là hoán vị.

Ký hiệu cho tổ hợp là C(n, k), thường viết là "n chọn k." Nó đếm số tập con k phần tử của tập hợp n phần tử.

Suy ra công thức: hoán vị chia bớt thứ tự

Đây là cách tính C(n, k). Bí quyết là kết nối nó với một khái niệm quen thuộc: P(n, k).

Xét việc chọn 7 sinh viên từ 50 cho các ngày khác nhau trong tuần. Đó là P(50, 7) — bài toán hoán vị.

Nhưng mình có thể chia quá trình đó thành hai bước:

  1. Chọn 7 sinh viên nào đi (tổ hợp: C(50, 7) cách)
  2. Sắp xếp 7 sinh viên đó theo các ngày (hoán vị của 7: 7! cách)
Loading diagram...

Vì cả hai cách đều đếm cùng một tập hợp:

P(n,k)=C(n,k)×k!P(n, k) = C(n, k) \times k!

Giải cho C(n, k):

C(n,k)=P(n,k)k!=n!k!(nk)!C(n, k) = \frac{P(n, k)}{k!} = \frac{n!}{k!(n-k)!}

Đó là công thức tổ hợp. k! ở mẫu chính xác là bước "quên thứ tự" — chia bớt tất cả các cách sắp xếp k phần tử đã chọn.

Ví dụ cụ thể

C(50,7)=50!7!×43!=50×49×48×47×46×45×447!C(50, 7) = \frac{50!}{7! \times 43!} = \frac{50 \times 49 \times 48 \times 47 \times 46 \times 45 \times 44}{7!}

Tử số là P(50, 7). Chia cho 7! = 5,040 để bỏ đi thứ tự. Kết quả là 99,884,400.

Thử các giá trị khác:

📊

Tổ hợp C(n, k)

Số cách chọn k vật từ n vật phân biệt (không phân biệt thứ tự)

Đầu vào
Kết quả
C(n, k) 99.884.400,00
P(n, k) để so sánh 503.417.376.000,00

Chú ý C(n, k) luôn nhỏ hơn P(n, k) — vì tổ hợp gộp tất cả k! cách sắp xếp cùng tập con lại thành một.

Câu hỏi then chốt: thứ tự có quan trọng không?

Phần khó nhất của bài toán đếm không phải công thức — mà là nhận ra công thức nào áp dụng. Và đây là "kim chỉ nam" giúp mình phân biệt chúng:

Hoán vị = dãy. Nếu các phần tử có vai trò, vị trí, hoặc nhãn khiến thứ tự tạo ra kết quả khác nhau, dùng P(n, k).

Tổ hợp = tập con. Nếu bạn chỉ chọn nhóm và thứ tự không liên quan, dùng C(n, k).

Cây quyết định đối chiếu hàng có thứ tự với túi không thứ tự

Loading diagram...

Ví dụ nhanh

Tình huốngThứ tự?Loại
Chọn 7 sinh viên đi chơi nhómKhôngC(50, 7)
Chọn 7 sinh viên, mỗi người một ngàyP(50, 7)
Chọn trưởng nhóm, thư ký, thủ quỹ, MC từ 20 ngườiP(20, 4)
Chọn 4 người đi hội nghị cùng nhauKhôngC(20, 4)

Bài trưởng nhóm/thư ký/thủ quỹ/MC là hoán vị vì đổi ai giữ vai trò nào tạo ra kết quả khác — dù cùng 4 người được chọn. Bài hội nghị là tổ hợp vì 4 người chỉ đi cùng nhau thôi.

Chuỗi nhị phân và tập con là cùng một thứ

Hóa ra C(n, k) không chỉ đếm tập con — nó còn đếm chuỗi nhị phân có số lượng bit 1 cố định (chuỗi nhị phân dài n có đúng k số 1).

Lý do là một song ánh tuyệt đẹp.

Song ánh

Lấy tập {1, 2, 3, 4} và xét tất cả tập con 2 phần tử. Có C(4, 2) = 6 tập:

Tập conChuỗi nhị phân
{1, 2}1100
{1, 3}1010
{1, 4}1001
{2, 3}0110
{2, 4}0101
{3, 4}0011

Cách làm: cứ i nằm trong tập con thì điền 1 vào vị trí i, không thì điền 0. Đơn giản vậy thôi.

Loading diagram...

Áp dụng cho mọi n và k. Mỗi tập con k phần tử ánh xạ đến đúng một chuỗi nhị phân có k số 1, và ngược lại. Vì đây là song ánh, hai tập có cùng kích thước: C(n, k).

Đếm chuỗi nhị phân trực tiếp

Bạn cũng có thể tính C(n, k) mà không cần biết song ánh — chỉ cần đếm trực tiếp chuỗi nhị phân.

Có bao nhiêu chuỗi nhị phân dài 8 có đúng 3 số 1?

Cách 1: Chọn vị trí. Có 8 vị trí. Chọn 3 vị trí đặt số 1. Đó là C(8, 3).

Cách 2: Anagram. Chuỗi có 3 số 1 và 5 số 0 chính là anagram của "00000111." Từ bài trước, số anagram là:

8!3!×5!\frac{8!}{3! \times 5!}

Và đó chính xác là C(8, 3) = 56.

Loading diagram...

Đây là điều mình thích nhất ở tổ hợp học — ba cách suy nghĩ hoàn toàn khác nhau (tập con, chuỗi nhị phân, anagram) đều hội tụ về cùng một công thức. Sự hội tụ đó không phải ngẫu nhiên; nó nói lên điều gì đó sâu sắc về cấu trúc.

Loading diagram...

Điểm mấu chốt nằm ở "thứ tự"

Có một câu hỏi khiến mình lúng túng ban đầu: nếu tổ hợp là đếm kiểu "thứ tự không quan trọng", thì tại sao nó lại dùng để đếm chuỗi nhị phân, nơi thứ tự 0 và 1 rõ ràng quan trọng?

Giải đáp: trong chuỗi nhị phân, thứ tự các bit quan trọng để xác định chuỗi nào. Nhưng thứ tự bạn chọn vị trí cho số 1 thì không quan trọng. Thực chất bạn đang chọn một tập con vị trí — mà đã là tập con thì không cần thứ tự.

C(8, 3) đếm số cách chọn 3 vị trí từ 8. Khi đã chọn xong, chuỗi được xác định. "Tổ hợp" nói về việc chọn, không phải về chuỗi cuối cùng.

Đường đi trên lưới: biến thể khác của cùng một công thức

Giả sử bạn di chuyển trên lưới 6 x 3 ô vuông, bắt đầu từ góc dưới-trái, muốn đến góc trên-phải. Chỉ được đi sang phải hoặc lên — không quay lại.

Một lưới phố với điểm bắt đầu, điểm kết thúc, và vài đường đi phải-lên được tô màu

Loading diagram...

Để đi từ góc dưới-trái đến góc trên-phải, bạn phải đi đúng 6 bước sang phải và 3 bước lên — tổng 9 bước. Mỗi đường đi chỉ là cách sắp xếp khác nhau của 9 bước này.

Một ví dụ về đường đi: P, L, P, L, L, P, P, P, P, P — khoan đã, hình như mình đếm nhầm... À đây: P, P, L, P, L, L, P, P, P. Mỗi đường đi như vậy thực chất là một anagram của 6 chữ P và 3 chữ L.

Đây chính xác là chuỗi nhị phân có số lượng bit 1 cố định, dài 9 và có 3 số 1 (nếu Lên = 1, Phải = 0). Hoặc tương đương, mình đang chọn 3 trong 9 bước nào là "đi lên."

Soˆˊ đường đi=C(9,3)=9!3!×6!=9×8×73×2×1=84\text{Số đường đi} = C(9, 3) = \frac{9!}{3! \times 6!} = \frac{9 \times 8 \times 7}{3 \times 2 \times 1} = 84

Thử các kích thước lưới khác:

📊

Đường đi trên lưới

Số đường đi ngắn nhất trên lưới chỉ đi phải và lên

Đầu vào
Kết quả
Tổng bước 9,00
Số đường đi 84,00

Chú ý: C(9, 3) = C(9, 6) = 84. Đây là tính đối xứng của tổ hợp — chọn 3 phần tử để đưa vào cũng giống chọn 6 phần tử để bỏ ra. Chọn 3 trong 9 bước đi lên tương đương chọn 6 bước đi phải.

Tổng quát hóa

Với lưới m x n, bạn cần m bước phải và n bước lên, tổng m + n bước. Số đường đi là:

C(m+n,n)=C(m+n,m)C(m + n, n) = C(m + n, m)

Bài toán đường đi, tập con, chuỗi nhị phân, anagram — tất cả là cùng một bài toán đếm mặc trang phục khác nhau. Mỗi lần gặp, bạn có thể chuyển sang dạng nào dễ giải nhất.

Quy tắc thương: Chìa khóa của mọi vấn đề

Có thể thấy, quy tắc thương chính là "công thần" đứng sau mọi bài toán đếm ở đây:

  • Anagram: mở rộng bằng cách tô màu chữ giống nhau, đếm hoán vị, chia cho đối xứng nội bộ
  • Hình học đối xứng: đếm tất cả hướng, chia cho đối xứng xoay/lật
  • Tổ hợp: đếm hoán vị (chọn có thứ tự), chia cho k! (số cách sắp xếp mỗi tập con)

Sơ đồ quy tắc thương nối anagram, hình đối xứng, tổ hợp, và chuỗi nhị phân

Loading diagram...

Quy luật luôn là: đếm trên một tập hợp lớn hơn (nơi mọi thứ đều có thể phân biệt được), rồi chia bớt cho sự trùng lặp. Một ý tưởng duy nhất đứng sau bốn kỹ thuật đếm khác nhau.

Một vài điều mình rút ra được

  • Tổ hợp đếm tập con (chọn không thứ tự), còn hoán vị đếm dãy (sắp xếp có thứ tự) — ranh giới là thứ tự có quan trọng hay không
  • Công thức tổ hợp C(n, k) = n! / (k!(n-k)!) chỉ là P(n, k) chia bớt k! cách sắp xếp
  • Khi phân vân dùng hoán vị hay tổ hợp, hãy hỏi: "nếu mình đổi thứ tự các phần tử đã chọn, kết quả có khác không?" — nếu có thì hoán vị, nếu không thì tổ hợp
  • Tập conchuỗi nhị phân có số lượng bit 1 cố định là cùng một thứ nhờ song ánh tự nhiên: phần tử trong tập con ứng với vị trí số 1 trong chuỗi
  • Chuỗi nhị phân mật độ cố định cũng là anagram của từ gồm k số 1 và (n-k) số 0 — ba góc nhìn, một công thức
  • Đường đi trên lưới m x n tương đương chọn n trong (m+n) bước nào đi lên — lại một tổ hợp đội lốt
  • Tính đối xứng C(n, k) = C(n, n-k) rất trực quan: chọn k phần tử đưa vào cũng giống chọn n-k phần tử bỏ ra
  • Đếm đối xứng vật lý (hình vuông, lục giác) dùng cùng quy tắc thương như anagram — tổng số cách sắp xếp chia cho số hướng của mỗi vật
  • Quy tắc thương là sợi dây nối anagram, đối xứng hình học, tổ hợp, và chuỗi nhị phân — một ý tưởng mặc bốn bộ đồ
  • Đặt tên cho thứ gì đó ("n chọn k") là một bước tiến thật sự, ngay cả trước khi tính ra con số — có ký hiệu giúp bạn suy luận về cấu trúc

Điều mình thấy tâm đắc nhất là mối liên hệ giữa việc đặt tên và sự thấu hiểu. Trong toán học cũng như lập trình, cái tên là điều kiện để ta tương tác với vạn vật. Bạn không thể thao tác trên thứ mà mình không gọi tên được. Công thức cho ta đáp án, nhưng cái tên mới cho ta quyền kiểm soát. Và quyền kiểm soát thì luôn có trước.

Phần 2/2 trong "Discrete Math for Algorithms"


Bình luận