ヤマカサのプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

麻雀の配牌のパターン数

配牌のパターン

麻雀の配牌は親は14枚,子は13枚です.麻雀の牌の種類は34で各4枚ずつあります.このことを元に数学的に配牌のパターン数を求めます.

形式的べき級数による定式化

集合  A_i (1 \leq i \leq 34)

 A_i = \lbrace 0, 1, 2, 3, 4 \rbrace

とします.この34個の集合から1つずつ元を選び,

 {\displaystyle \sum_{i=1}^{34}a_i = 14}

を満たすような選び方は何通りあるかは親の配牌のパターン数に一致します.

この数は, (1 + x + x^{2} + x^{3} + x^{4})^{34} x^{14} の係数です.詳しくは下のサイトを参照してください.

[多項式・形式的べき級数](1)数え上げとの対応付け | maspyのHP

結果

親の配牌のパターンは326520504500通りで,子では98521596000通りあります.

麻雀の数学

コード

List<int> mul(List<int> f, List<int> g, int n) {
  List<int> ret = List.generate(n, (index) => 0);
  for (int i = 0; i < f.length; i++) {
    for (int j = 0; j < g.length; j++) {
      if (i + j >= n) break;
      ret[i + j] += f[i] * g[j];
    }
  }
  return ret;
}

void main(List<String> args) {
  List<int> f = [1, 1, 1, 1, 1];
  List<int> h = mul(f, f, 15);
  for (int i = 0; i < 32; i++) {
    h = mul(f, h, 15);
  }
  print(h);
}