{{1,1},{1,2},{1,3},{1,4},{1,5}}をID1とし、{{4,9},{4,10},{4,11},{4,12},{4,13}}をID52C5とするようなプログラムを作りたい。
まずは{1,1}から{4,13}を1次元の数に変換した方が都合よさそうなのでこれは{2,6}ならば{1,13}まで13個、{2,1}から6個なので19番目という例を利用すれば、
13*((第1要素)-1)+(第2要素)=13*(第1要素)+(第②要素)-13で与えられる。
すると{1,2,3,4,5}をID1,{48,49,50,51,52}をID52C5=2598960とする問題に変わる。
まず1つ目の値が2となるのは、{1,2,3,4,5}から{1,49,50,51,52}までの総数であるがこれは{2,3,4,5}から{49,50,51,52}までの2~52の51個の数字を4つ選ぶ組み合わせに相当するので51C4通りである。その51という数字は2~52由来、またその2は第1要素であるから、以後要素をそれぞれq,b,c,d,eと置き換えるとa~52由来なので52-a+1C4=53-aC4となる。
例えば{4,5,6,7,8}ならば1スタートは{1,2,3,4,5}から{1,49,50,51,52}の52-2+1C4通り、{2,3,4,5,6}から{2,49,50,51,52}の50C4通り…と{3,49,50,51,52}まで51C4+50C4+49C4通りが存在することになるのでSUMを用いてSUM(i=2,a,53-iC4)となる。
つづいて{4,7,8,9,10}はここまでの{4,6,50,51,52}までのどれだけのパターンがあるかを考える。第2要素bは7であるが、5,6,7,8から5,50,51,52までは52-5+1C4通り存在する。これを6についても同様に行うのでSUMの開始は5(=a+1)で始まり6(=b-1)で終わる。
具体的には{4,5,6,7,8}から{4,5,50,51,52}の6~52の3つ選びで47C3通り、{4,6,7,8,9}から{4,6,50,51,52}の7~52の3つ並びで46C3通りがある。
すなわちSUM(i=a+2,b,53-iC3)(=i=a+1,b-1,52-iC3)となる。以後同様に繰り返せばよい。
実際30000番目は{{1, 1}, {1, 3}, {2, 2}, {3, 3}, {4, 12}}であるが、これを先ほどの関数に代入すれば30000となり逆関数が成立する。
ここまでSUMで式を表したが、Combinationにおいては変数を使っても多項式で表すことができるので先に計算すると
1/120 (31212504 a - 1249250 a^2 + 24995 a^3 - 250 a^4 + a^5 -
5 (-514898 b + 15299 b^2 - 202 b^3 + b^4 -
4 (-1765218 + 7802 c - 153 c^2 + c^3 + 309 d - 3 d^2 + 6 e)))という多項式で表すことができる。なのでこの辺りは普通に高校範囲。京大あたりの入試問題に出ててもおかしくなさそう。
これにより先ほどの7組のカードから最大の役を判定するプログラムは一瞬でできるようになったので、次は各フェーズにおける最大の役の確率分布を計算する段階へと入る。
(1000回試行で16秒程度)