#include using namespace std; #ifdef DEB #define D if(1) #else #define D if(0) #endif #define fo(a,b) for(int a=0;a<(b);++a) using ll = long long; inline int mod(int a) { int MOD = 167772161; return ((a%MOD)+MOD)%MOD; } const int MAX = 444; const int CMAX = 888; int n,k; int a[MAX]; int dp[MAX][CMAX]; int rev[MAX][CMAX]; #define PA(p, a...) \ D do{\ printf(a);\ printf("\n");\ fo(veci, n+1)\ {\ fo(cena,2*k+4) printf("%2d ",p[veci][cena]);\ printf("\n");\ }\ printf("\n");\ }while(0); int main(int argc, char ** argv) { scanf("%d%d", &n, &k); fo(i,n) scanf("%d", a+i); dp[0][0]=1; fo(i,n) { for(int veci = n; veci-->0;) fo(cena, CMAX) if(cena-a[i] >= 0) dp[veci+1][cena] = mod(dp[veci+1][cena] + dp[veci][cena-a[i]]); } PA(dp, "DP"); fo(i,n) { fo(veci, n+1) { fo(cena, CMAX - a[i]) //rev[veci][cena] = mod(dp[veci+1][cena+a[i]] - rev[veci+1][cena+a[i]]); if( veci && cena-a[i]>=0) rev[veci][cena] = mod(dp[veci][cena] - rev[veci-1][cena-a[i]]); else rev[veci][cena] = mod(dp[veci][cena]); } PA(rev, "REV %d -> %d", i, a[i]); for(int veci=1;veci