コード:
#include <ビット/ STDC ++ H> に#define N 10005 の#defineは長い長いLL 名前空間stdを使用します。 constのLL 1000000007 = MOD; setIO(文字列s)無効 { "に" = S内の文字列+します。 文字列アウト= sの+ "アウト。"; freopenは(in.c_str()、 "R"、STDIN)。 } [N]をint型。 LLのFAC F [N]、INV [N]、[N]、G [N]。 LLのqpow(LLのX、LLのY) { LL TMP = 1LL。 用(; Y、Y >> = 1、X = X * X%のMOD) であれば(Y&1)TMP = TMP * X%MOD。 TMPを返します。 } LLのInv(LL X){戻りqpow(X、MOD-2)。} LL C(int型のx、int型のY) { 戻りFAC [X] * INV [Y]%MOD * INV [XY]%MOD。 } メインint型() { // setIO( "入力")。 I、J、N、M int型。 FAC [0] = INV [0] = 1LL。 用(i = 1; iがN <; ++ I)FAC [i]は= FAC [I-1] * 1LL * I MOD%、INV [I] = Invの(FAC [I])。 scanf関数( "%d個の%のD"、&N、&M)。 用(i = 1; I <= M; ++ I)のscanf( "%dの"、および[I])。 用(i = 0; iは= N <; ++ I) { F [i]は= C(N、I)。 用(J = 1; J <= M; ++ j)は(F [I] = F [i]は* C([J] + NI-1、NI-1)%のMOD)%= MOD。 } (i = 0; iが<= N; I ++)のための { %= MOD([I] MOD + MOD%のF、G [0] + = qpow(-1、I)*)。 } のprintf( "%LLDする\ n"、G [0])。 0を返します。 }