Pagini recente » Cod sursa (job #1541992) | Cod sursa (job #1941023) | Cod sursa (job #1892705) | Cod sursa (job #2905553) | Cod sursa (job #1851405)
#include <cstdio>
#define MOD 3210121
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
using namespace std;
int a[21][31];
int comb[10001];
int N, S, K;
int v[21];
int best[21][31];
int rezf = 0;
void back()
{
int sum;
int k = 1;
v[k] = 0;
while(k > 0)
{
if(v[k] < N)
{
v[k]++;
sum = 0;
for(int i = 1; i <= K; i++)
{
best[k][i] = max(best[k - 1][i], a[v[k]][i]);
sum += best[k][i];
}
if(S - sum >= 0)
{
if(k % 2 == 1)
rezf = (rezf + comb[S - sum]) % MOD;
else
{
rezf = (rezf - comb[S - sum]) % MOD;
while(rezf < 0) rezf += MOD;
}
}
k++;
v[k] = v[k - 1];
}
else k--;
}
}
int main()
{
int i, j;
freopen("cowfood.in", "r", stdin);
freopen("cowfood.out", "w", stdout);
scanf("%d%d%d", &K, &S, &N);
for(i = 1; i <= N; i++)
{
for(j = 1; j <= K; j++)
{
scanf("%d", &a[i][j]);
}
}
for(i = 0; i <= S; i++)
comb[i] = 1;
for(i = 1; i <= K; i++)
{
for(j = 1; j <= S; j++)
{
comb[j] += comb[j - 1];
comb[j] %= MOD;
}
}
back();
int mv = (comb[S] - S * K - 1)%MOD;
while(mv<0)mv+=MOD;
rezf = (mv - rezf) % MOD;
while(rezf < 0) rezf += MOD;
printf("%d", rezf);
return 0;
}