Pagini recente » Cod sursa (job #3278907) | Cod sursa (job #2624984) | Cod sursa (job #2878767) | Cod sursa (job #850859) | Cod sursa (job #2071405)
#include <bits/stdc++.h>
#define MOD 3210121
#define MaxC 184756
#define MaxS 10000
#define MaxK 30
#define MaxN 20
using namespace std;
int v[2][MaxC+1][MaxK+1];
int a[MaxN+1][MaxK+1];
int last[MaxC+1];
int good[MaxS+1];
int dp[MaxS+1];
int main(){
FILE* fin = fopen("cowfood.in","r");
FILE* fout = fopen("cowfood.out","w");
int i,j,k,l,step,temp,res,K,S,N,M,P;
fscanf(fin,"%d %d %d",&K,&S,&N);
for(i = 0; i <= S; ++i) dp[i] = 1;
for(i = 2; i <= K; ++i)
for(j = 1; j <= S; ++j)
dp[j] = (dp[j-1] + dp[j]) % MOD;
for(i = 1; i <= S; ++i) good[i] = (dp[i] - K + MOD) % MOD;
for(i = 2; i <= S; ++i) good[i] = (good[i] + good[i-1]) % MOD;
for(i = 1; i <= S; ++i) dp[i] = (dp[i] + dp[i-1]) % MOD;
if(!N) fprintf(fout,"%d\n",good[S]);
else{
for(i = 1; i <= N; ++i)
for(j = 1; j <= K; ++j)
fscanf(fin,"%d",&a[i][j]);
M = N;
l = res = 0;
for(i = 1; i <= N; ++i) last[i] = i;
for(i = 1; i <= N; ++i)
{
temp = 0;
for(j = 1; j <= K; ++j) v[0][i][j] = a[i][j], temp += a[i][j];
if(temp <= S) res = (res + dp[S-temp]) % MOD;
}
for(step = 2; step <= N; ++step, l = 1 - l)
{
P = 0;
for(i = 1; i <= M; ++i)
for(j = last[i] + 1; j <= N; ++j)
{
last[++P] = j;
for(k = 1; k <= K; ++k) v[1-l][P][k] = max(v[l][i][k], a[j][k]);
}
for(i = 1; i <= P; ++i)
{
temp = 0;
for(j = 1; j <= K; ++j) temp += v[1-l][i][j];
if(temp <= S) res = (res + (step % 2 ? 1 : -1) * dp[S-temp] + MOD) % MOD;
}
}
fprintf(fout,"%d\n",(good[S] - res + MOD) % MOD);
}
return 0;
}