できなかった問題を editorial や他の人のコードを見ながら書いてみるシリーズ。
N, K, 長さ N の数列が与えられるので、数列から K 個を選ぶ方法の数を MOD 1000000007 で出力する。
ただし、各桁が 4 or 7 だけでできている lucky number に関しては同じ数字を1回までしか使ってはいけない。という問題。
非 lucky number の数字を2回以上使う場合、同じ数字でも取ってくる元の位置が違えば異なるとみなす。
lucky number を i 個使った場合、K-i 個の非 lucky number を選ぶ組み合わせは「非lucky numberの個数 C K-i」になる
lucky number の選び方は...
10**9 以下の lucky number は 1022 個しかないので、次の DP が考えられる。
pos: 何番目までの lucky number を使ったか (0-)
cnt: lucky number をいくつ使ったか
dp[i][0] = 1 dp[i][j] = dp[i-1][j] (i番目を使わない場合) + dp[i-1][j-1] * count[i] (i番目を使う場合、その数の出現個数だけ選択肢がある)
nl : lucky number の(重複を除いた)個数
rest : 非lucky numberの個数
comb : 二項係数
で最終的な答えは Σi=[0, nl] comb(rest, K-i) * dp[nl][i] で計算できる。
で、いくつか知見が得られた。(間違ってたら指摘お願いします..)