Hatena::Grouptopcoder

kojingharangの日記 RSSフィード

 | 

2012-01-27

Codeforces 105 Div2 E. Lucky Subsequence

12:25 |  Codeforces 105 Div2 E. Lucky Subsequence - kojingharangの日記 を含むブックマーク はてなブックマーク -  Codeforces 105 Div2 E. Lucky Subsequence - kojingharangの日記  Codeforces 105 Div2 E. Lucky Subsequence - kojingharangの日記 のブックマークコメント

できなかった問題を 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 が考えられる。

dp[pos][cnt]

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] で計算できる。


で、いくつか知見が得られた。(間違ってたら指摘お願いします..)

 |