#include <ビット/ STDC ++ H> に#define LL長い長い 使用して 名前空間STDを、 const int型 MOD = 1E9 + 7 。 インラインINT RD(登録整数 X = 0、レジスタチャー CH = GETCHAR()、レジスタINT F = 0 ){ ながら = CH == F(isdigit(CH)!)' - '、CH = GETCHAR()。 一方、(isdigit(CH))X =(X << 1)+(X << 3)+ CH- 48、CH = GETCHAR()。 リターン F - ? X:X; } LL mgml(-1,11,11- B、LL ANS = 1 ){ ため(; B; B >> = 1、A = A *%のMOD)場合(B&1)ANS = ANS *%のMOD。 戻り値は、ANS; } int型N、M、K。 INT メイン(){ N = RD(); M = RD(); K = RD()。 もし(N + M- 1 > k)の戻りプット(" 0 ")&0 。 もし(N == 1 ){ LL ANS = 1 。 以下のための(int型 iはkは=; I> = K-M +1 ; - I)ANS = ANS * I%MOD。 リターンのprintf(" %のLLD \ N "、ANS)&0 ; } 戻り 0 。 } / * //萎了... の#include <ビット/ STDC ++ H> に#define LL長い長い 名前空間stdを使用。 const int型MOD = 1E9 + 7。 インラインINT RD(登録整数X = 0、レジスタチャーCH = GETCHAR()、INTレジスタF = 0){ ながら(!のisdigit(CH))= CH == F ' - '、CH = GETCHAR()。 一方、(isdigit(CH))X =(X << 1)+(X << 3)+ CH-48、CH = GETCHAR()。 リターンF -x:X;? } LL mgml(LL B -1,11,11- ANS = 1){ } int型N、M、K。 ため(; B; B >> = 1、A = A *%のMOD)(B&場合 ANSを返します。 INT DP [15] [15] [1050]。 ベクター<整数>状態[15]。 メインINT(){ N = RD(); M = RD(); K = RD()。 (N + M-1> k)の戻りプット( "0")であれば&0。 INT U = 1 << K。 以下のために(INT I 0 =; I <U; ++ I){ int型のCC = 0。 以下のための(int型J =; J; J-= J&-j)CC ++; 状態[CC] .push_back(I)。 } ため(INT I 1 =; I <= N; ++ I)DP [I] [0] [0] = 1; 以下のために(INT I = 1; I <= M; ++ I)DP [0] [i]が[0] = 1; INT COL1 = RD()。 (COL1)DP [1] [1] [1 << col1-1] = 1の場合。 そうでなければ(私は1 = INT; I <= K; ++ i)に対するDP [1] [1] [1 << I-1] = 1。 以下のために(INT I 1 =; I <= N; ++ i)に対する(INT J = 1; J <= M; ++ J){ int型COL = RD()。 IF(COL){ 用(?INT S1 = 0、LIM1 = I == 1 0:MAX(I-1、j)は、S1 <(INT)状態[LIM1] .size(); ++ S1) のための(INT S2 = 0、 LIM2 = J == 1 0:MAX(I、J-1)、S2 <(INT)状態[LIM2] .size(); ++ S2){ int型X =状態[LIM1] [S1]、Y =状態[LIM2] [S2]。 IF((X&(1 << COL-1))== 0 &&(Y&(1 << COL-1))== 0)(DP [I] [J] [X | Y |(1 << col- 1)] + = 1LL * DP [I-1]〜[J] [X] * DP [I]、[J-1] [Y]%のMOD)%= MOD。 } } 他{ ため(INT S1 = 0、LIM1 = I 1 == 0:MAX(I-1、j)は、S1 <(INT)状態[LIM1] .size(); ++ S1) (INT用S2 = 0、LIM2 = J == 1 0:MAX(I、J-1)、S2 <(INT)状態[LIM2] .size(); ++ S2){ int型X =状態[LIM1] [S1 ]、Y =状態[LIM2] [S2]。 //のprintf( " - >%D%D%D%D%D \ n"は、私は、 用(int型、D =(U-1)^(X | Y); D; D- = D&-d)(DP [I] [J] [X | Y |(D&-d)] + = 1LL * DP [I-1]〜[J] [X] * DP [I]、[J-1] [Y]%のMOD)%= MOD。 } } } //のためには、(INT iは1 =; I <= N; ++ i)に対する(INT J = 1; J <= M; ++ j)のための(INT D = 0; D <U; ++ D)のprintf( "I:%のDJ:%のDD:%D DP:%D \ n"は、I、J、D、DP [I] [J] [D])。 int型ANS = 0; 以下のために(INT I 0 =; I <U; ++ i)から(ANS + = DP [n]が[M] [I])%= MOD。 printf( "%dの\ n"は、(ANS%MOD + MOD)%のMOD)。 0を返します。 } * /
RT
おすすめ
転載: www.cnblogs.com/hzoi2018-xuefeng/p/12227858.html
おすすめ
ランキング