Pagini recente » Cod sursa (job #3269573) | Cod sursa (job #1171157) | Cod sursa (job #2881359) | Cod sursa (job #2675399) | Cod sursa (job #1598626)
#include <bits/stdc++.h>
using namespace std;
const int mod = 3210121;
int k , s , n , i , j , sc , curr , mask;
int a[29][39] , tmp[39];
long long result;
long long d[39][20009] , w[20009];
void runw()
{
int i , j;
for (i = 0 ; i <= s ; ++i)
d[1][i] = 1;
for (i = 2 ; i <= k + 1 ; ++i)
{
d[i][0] = 1;
for (j = 1 ; j <= s ; ++j)
d[i][j] = (d[i][j - 1] + d[i - 1][j]) % mod;
}
}
int main()
{
freopen("cowfood.in" , "r" , stdin);
freopen("cowfood.out" , "w" , stdout);
scanf("%d%d%d" , &k , &s , &n);
for (i = 0 ; i < n ; ++i)
for (j = 0 ; j < k ; ++j)
scanf("%d" , &a[i][j]);
runw();
for (mask = 0 ; mask < (1 << n) ; ++mask)
{
curr = 0;
for (i = 0 ; i < k ; ++i)
tmp[i] = 0;
for (i = 0 ; i < n ; ++i)
if (mask & (1 << i))
{
for (j = 0 ; j < k ; ++j)
tmp[j] = max(tmp[j] , a[i][j]);
curr++;
}
sc = s;
for (i = 0 ; i < k ; ++i)
sc -= tmp[i];
if (sc < 0) continue;
if (curr & 1) result = (result - d[k + 1][sc] + mod) % mod;
else result = (result + d[k + 1][sc] + mod) % mod;
}
if (k > 1)
result = (result - s * k - 1 + mod) % mod;
printf("%lld\n" , result);
return 0;
}