Pagini recente » Cod sursa (job #2462193) | Cod sursa (job #400677) | Cod sursa (job #556059) | Cod sursa (job #998651) | Cod sursa (job #1200663)
#include<fstream>
#define MOD 3210121
#define N 30
#define K 40
#define S 10010
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int i,j,s,k,n,sol,inv,v[N],a[N][K],d[S][K],maxi[K][N];
inline void back(int kk , int semn){
if(kk >= 2)
{
int sum = s;
for(int i = 1 ; i <= k ; ++ i)
sum -= maxi[i][kk - 1];
if(sum < 0)
return;
inv = (inv + semn * d[sum][k] + MOD) % MOD;
}
if(kk > n)
return ;
for(int i = v[kk - 1] + 1 ; i <= n ; ++ i)
{
v[kk] = i;
for(int j = 1 ; j <= k ; ++ j)
maxi[j][kk] = max(maxi[j][kk - 1],a[i][j]);
back(kk + 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 = 0 ; i <= k ; ++ i)
d[0][i] = 1;
for(i = 1 ; i <= s ; ++ i)
d[i][0] = 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] - s * k - inv - 1;
while(sol < 0)
sol += MOD;
g << sol << '\n';
return 0;
}