F.京屋との色のボール
テストあたりの時間制限
2秒
テストごとのメモリ制限
256メガバイト
入力
標準入力
出力
標準出力
鳳鏡夜を有する袋有する N で着色された着色されたボール K 色違い。色はから標識されている 1に K。同じ色のボールは区別できません。バッグが空になるまで、彼は一つの袋のいずれかからボールを描画します。彼は色の最後のボールを描いたことに気づいた 私の色の最後のボールを描画する前に、 私は すべてのために+ 1 iの から に1 K - 1。今、彼はこの現象が発生することができますどのように多くの異なる方法疑問に思います。
入力
入力の最初の行は1つの整数があります K (1≤ K 1000年≤)色の数。
次に、 k個の 行が続きます。 I番目の行が含まれています cは私のボールの数 I(番目の色≤1 cは、私は 1000以下)。
ボールの総数は、1000年を超えてはなりません。
出力
単一の整数、文に記載されているように京屋が袋からボールを引くことができるいくつかの方法、モジュロ 1 000 000 007。
例
入力
コピー
3
2
2
1
出力
コピー
3
入力
コピー
4
1
2
3
4
出力
コピー
1680
注意
最初のサンプルでは、私たちは色1の2つのボール、色2の2球、及び京屋のための三つの方法3色の1個のボールを持っています:
1つの2 3 2 1
1 1 2 2 3
2 1 1 2 3
質問の意味:
同じとみなし、同じ色のボールのn個の色ボールの合計が、設定された配置ルールの一種類は、それが最後のカラーボールであります現在のカラーボールは、最後の1の前に置かれたプログラムの数とボールを置くように頼まなければなりません。
溶液:
分けて考える場合、我慢する色の色、DP [i]は、カラースキームのいくつかの種類を入れて示しI、A [i]が和、i番目のボールの色の数を表します。 [I] I-1色のボールに、端面に質問を置く必要があり、i番目のボールを満たすように意図されているときに、次にボールプラグを転送する、非常に多くの合計前I-ボールを示し、すなわち、現在の総和[I-1] + [I] -1 位置は、[i]は残りのi番目のボール中のこれらの位置に配置され-1位置が、そのような操作の数は方法で検索しますC [[I-1 + [I]和-1]] [[I] -1]
#include <iostreamの> する#include <cstdioを> する#include <CStringの> に#define MAXN 1010 の#define MOD十億七 使用 名前空間STDを、 int型のn、[MAXN]、C [MAXN] [MAXN]、DP [MAXN]和[MAXN]。 INT メイン(){ scanf関数(" %のD "、&N) 以下のために(int型 i = 1 ; iが<= N; iが++ ){ scanf関数(" %dを"&[I])。 和[I] =和[I- 1 ] + [I]。 } C [ 0] [ 0 ] = 1 。 以下のために(int型 i = 1 ; iは= < 1000年 ; iは++ ){ Cを[I] [ 0 ] = 1 ; 用(INTの J = 1 ; J <= 1000年 ; J ++ ) C [I] [J] =(C [I- 1 ] [J- 1 ] + C [I- 1 ] [j])%MOD。 } DP [ 0 ] = 1 。 用(int型 iは= 1 ; iが<= N iが++ ) DP [I]= 1LL * DP [I- 1 ] * C [I] - 1 +合計[I- 1 ]] [[1] - 1 ]%MOD。 printf(" %d個の\ n " 、DP [N])。 リターン 0 ; }