Pagini recente » Cod sursa (job #1089019) | Cod sursa (job #946898) | Cod sursa (job #3283062) | Cod sursa (job #2899237) | Cod sursa (job #1430477)
#include<fstream>
#define S 10020
#define N 22
#define K 33
#define MOD 3210121
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int k,s,n,i,j,sol,a[N][K],d[S][K],maxi[N][K],v[N],inv;
inline void back(int p , int semn){
if(p > 1)
{
int i,suma = s;
for(i = 1 ; i <= k ; ++ i)
suma -= maxi[p - 1][i];
if(suma < 0)
return ;
inv = (inv + MOD + semn * d[suma][k]) % MOD;
}
if(p > n)
return;
for(int i = v[p - 1] + 1; i <= n ; ++ i)
{
v[p] = i;
for(int j = 1 ; j <= k ; ++ j)
maxi[p][j] = max(maxi[p - 1][j] , a[i][j]);
back(p + 1 , -semn);
}
}
int main()
{
f >> k >> s >> n;
for(i = 1 ; i <= n ; ++ i)
for(j = 1 ; j <= k ; ++ j)
f >> a[i][j];
for(i = 1 ; i <= s ; ++ i)
d[i][0] = 1;
for(i = 1 ; i <= k ; ++ i)
d[0][i] = 1;
for(i = 1 ; i <= s ; ++ i)
for(j = 1 ; j <= k ; ++ j)
d[i][j] = (d[i - 1][j] + d[i][j - 1]) % MOD;
back(1 , -1);
sol = d[s][k] - inv + MOD - s * k - 1;
while(sol < 0) sol += MOD;
while(sol >= MOD) sol -= MOD;
g << sol << '\n';
return 0;
}