蟻本に載っている重複組み合わせの式変形がピンとこなかったので、頭の整理をするためにメモを。
問題
種類の品物が存在し、
番目の品物が
個あるとき、これらの中から
個選ぶ組み合わせの総数を求めよ、というものになります。
解法
まずはの解法からです。
番目までの品物の中から
個選ぶ組み合わせ
のようにすると、
番目の品物を
個選んだときに選んだ品物が合計
になるようにするには、
番目までの品物で
個選んでいればよいので、
通りの組み合わせが考えられます。
そして、は
から
までが考えられるので、最終的な遷移は
となります。
これを、うまく式変形することで、計算量を落とします。この式変形を何も見ずに行った人はかなりの猛者ではないかなと思います…
方針としては、今式に表れているシグマの部分を、どこかほかの配列を参照できるようにすることで、kのループを削除する、というものになります。
前提として、配列の添え字が負になっているときは、その中身は0であるとします。
まず、先ほどの式のうち、の部分を、
にずらします。
の範囲はそのままにするので、
ずらすことで、余分なものと足りないものが一つずつ現れます。なので、その部分を調整します。
足りなくなったものは、ずらす前には存在した、のときの
になります。これをシグマの外で足してあげます。
逆に余分になったものは、ずらした後の最後の部分、になります。これをシグマの外で引いてあげます。
もうすこし整理すると、は、
が
のとき
となり、になります。
このとき、も負であるので、
もです。
が
のとき
となります。
よって、どちらの場合でもでカバーできていることになります。これで少しだけ式をスッキリさせることができました。
ここまでの操作を整理して式変形をまとめると、
となります。ところで、の範囲について調べてみると、
は
でいいことがわかります。
なぜなら、
が
のとき
は
なので
となります。
が
のとき
なので、
となることはありません。
ということで、さらに式変形をすると、
となります。
最後に、
最初の項はそのものなので置き換えることができ、
となります。
これで、まで計算量を落とすことができました。