atcoder#AGC013D. [AGC013D] Piling Up

[AGC013D] Piling Up

配点 : 900900

問題文

joisinoお姉ちゃんは、大きな箱と、たくさんの赤い積み木と青い積み木を持っています。 joisinoお姉ちゃんは、次の手順にそって、これらの積み木を積み上げることにしました。

まず、赤い積み木と青い積み木を、合わせて NN 個、箱に入れます。 合計で NN 個ならば、それぞれの色の積み木の個数に制限はありません。 特に、一方の色の積み木の個数が 00 個でも構いません。 次に、ある操作を MM 回行います。 11 回の操作は、以下の 33 つのステップからなります。

  • 好きな積み木を箱から 11 つ取り出す。
  • 赤い積み木と青い積み木を 11 つずつ箱にいれる。
  • 再び、好きな積み木を箱から 11 つ取り出す。

MM 回の操作のあと、それまでに取り出した積み木を、取り出した順番に積み重ねます。 joisinoお姉ちゃんは、こうして積みあがる 2×M2 \times M 個の積み木の色の組み合わせが何通りあるか知りたくなりました。 あなたの仕事は、joisinoお姉ちゃんの代わりにこれを求めるプログラムを作ることです。 なお、答えは非常に大きくなることがあるので、109+710^9+7 で割った余りを出力してください。

制約

  • 1N30001 \leq N \leq 3000
  • 1M30001 \leq M \leq 3000

入力

入力は以下の形式で標準入力から与えられる。

NN MM

出力

積み上がる積み木の色の組み合わせが何通りあるかを求め、109+710^9+7 で割った余りを出力せよ。

2 3
56

積み木を取り出すステップは合計で 66 回行われます。 2,3,4,52,3,4,5 番目に取り出す積み木の色が全て同じになるような取り出し方だけがあり得ないので、 答えは、262×2×2=562^6 - 2 \times 2 \times 2 = 56 となります。

1000 10
1048576
1000 3000
693347555