圧力のようなGesha $ qwq $
アイデア:$ DPの$へ
提出:2($ int型$を開いて自信を持って)
問題の解決策:(注を参照してください)
書式#include <cstdioを> する#include <iostreamの> 使用して 名前空間はstdを、 #defineは、符号なしの長い長いULL の#defineが長い長いちゃう の#define RレジスタのLL の#define休止((RためにI = 1; iが<= 10000000000; ++ I)) の#define freopenは( "NOIPAK ++で"、 "R IN 」、STDIN) の#defineアウトfreopenは( "out.out"、 "" W、STDOUT) 名前空間FREAD { 静的 チャー B [ 1 << 15 ]、* S = B * D = B。 JACK #ifndefの に#define?:GETCHAR()(S == D &&(D =(S = B)+関数fread(B、1,1 << 15、STDIN)、S == D)EOF G(){ R RET = 0、=解決1。登録のchar chのを。しばらく(!isdigit(CH = getchar関数()))修正= CH == ' - ' - ?1 :修正します。 もし(CH == EOF)の戻り EOF; DO RET = RET * 10 +(CH ^ 48)。一方、(isdigit(CH = GETCHAR()))。リターンのRET *の修正。 }インラインブールのisEmpty(CONST チャー&CH){ リターン(CH <= 36 || CH> = 127 );} インラインボイド GS(チャー *のS){ 登録チャー CHを、一方(のisEmpty(CH = )GETCHAR()); 実行 * S ++ = CHを、一方(のisEmpty(CH =!GETCHAR())); } } 使用 FREAD :: G ; 使用FREAD :: GS; のconst int型 N = 110、M = 9999973 ; INT N-、M、ANS; LL F [N] [N] [N]; // F [I] [J] [K]:行番号i、jの片を含む列の数、の二つの部品を含む行のk個の 符号付きのmain(){ N- = G()、M = G(); F [ 0 ] [ 0 ] [ 0 ] =1 ; 以下のための(R iは= 1 ; iが<= N; ++ I)のための(R jを= 0 ; J <= M; ++ j)のための(R、K = 0 ; <= MJ k個; ++ K){ F [I] [J] [K] + = F [I- 1 ] [j] [k]は、 // 不填棋子 場合(J> = 1)F [I] [J] [K] + = F [I- 1 ] [J- 1 ] [K] *(MK-J + 1 )。 // 选空列填一个棋子 場合(K> = 1 [I] [J] [K] + = F [I-F)1 ] [J + 1 ] [K- 1 ] *(J + 1 )。 // の部分を含有する塔から選択 IF(J> = 2)F [I] [J] [K] + = F [I- 1 ] [J- 2 ] [K] *(MK-J + 2)*を(MK-J +は、1。)/ 2 ; // 2つの空のカラムを充填するためのオプションは、一片である IF(K> = 1)F [I] [J] [K] + = F [I- 1 ] [J] [K - 1 ] *(MK-J + 1)* J; // 空の列から選択され、それぞれの列の一部を含む部分を埋める IF(K> = 2)F [I] [J] [K] + = F [I- 1 ] [J + 2 ] [ - K- 2 ] *(J + 2)*(J + 1)/ 2 。 // 各ピースの充填含むツーピースから選択 F [I] [J] [K]%= ; M } のための(R&LT J = 0 ; J <= M; J ++)のための(R&LT K = 0 ; K <= MJ; ++ K)ANS =(F + ANS [N-] [J] [K])%M; のprintf(" %d個の\ N- " 、ANS); }
2019年7月17日