そこ操作を法、それほど差は、金型の意味での直接維持することができます。
コード:
#include <ビット/ STDC ++ H> に#define M 16 の#define N 801 の#defineっ長い長 の#define MOD十億七 の#define setIO(S)freopenは(S ".IN"、 "R"、STDIN) 名前空間stdを使用。 int型V [N] [N]。 INT DP [N] [N] [M] [2]。 ボイド追加(INT&、int型B) { LL C =(1LL * A + 1LL * B + MOD)%MOD。 =(INT)C。 } int型のmain() { int型N、M、K、I、J。 // setIO( "入力"); scanf関数( "%D%D%D"、&N、&M&K)、++、K。 用(i = 1; iは= N <; ++ I) のために(J = 1; J <= M; ++ j)をscanf関数( "%のD"、&V [I] [J])。 用(i = 1; iは= N <; ++ I) J <= M;(J = 1 (I ++; iが<= N I = 1)のために { (; J <= M ++ J J = 1)のために { ため(++ D INTさd = 0; D <K) { (IF I-1> = 1) { (DP [I] [J] [D] [0]、DP [I-1]〜[J] [(DV [I] [J] + K)%のK] [1を追加]); (DP [I] [J] [D] [1]、DP [I-1]〜[J] [(D + V [I] [J])%のK] [0])を追加します。 } IF(J-1> = 1) { (DP [I] [J] [D] [0]、DP [I]、[J-1] [(DV [I] [J] + K)%Kを追加] [1])。 (DP [I] [J] [D] [1]、DP [I]、[J-1] [(D + V [I] [J])%のK] [0])を追加します。 } } } } int型ANS = 0。 用(i = 1; iは= N <; ++ I) { ため(J = 1; J <= M; ++ j)の 追加(ANS DPを[I] [J] [0] [1])。 } printf( "%d個の\ n"、ANS)。 0を返します。 }