Pagini recente » Cod sursa (job #2092859) | Cod sursa (job #220718) | Cod sursa (job #351157) | Cod sursa (job #2637212) | Cod sursa (job #2639767)
#include <bits/stdc++.h>
using namespace std;
ifstream in ("cowfood.in");
ofstream out ("cowfood.out");
const int MOD = 3210121;
bool check ( int ind );
int bkt ( int ind, int y );
int k, s, n;
int q[22][32];
int dp[32][1 << 14];
int p[32][32];
int sorin;
int nr, sum;
int main()
{
in >> k >> s >> n;
for ( int i = 1 ; i <= n ; ++i )
for ( int j = 1 ; j <= k ; ++j )
in >> q[i][j];
for ( int i = 0 ; i <= k ; ++i )
dp[i][0] = 1;
for ( int j = 0 ; j <= s ; ++j )
dp[0][j] = 1;
for ( int i = 1 ; i <= k ; ++i )
for ( int j = 1 ; j <= s ; ++j )
dp[i][j] = ( dp[i - 1][j] + dp[i][j - 1] ) % MOD;
sorin = ( bkt ( 1, 0 ) - k * s - 1 ) % MOD;
if ( sorin < 0 )
sorin += MOD;
out << sorin;
return 0;
}
int bkt ( int ind, int y )
{
if ( ind == n + 1 )
{
nr = 0;
sum = s;
for ( int i = 1 ; i <= k ; ++i )
sum -= p[ind][i];
for ( int i = 1 ; i <= n ; ++i )
if ( y & ( 1 << i ) )
++nr;
if ( sum < 0 )
return 0;
if ( nr & 1 )
return dp[k][sum] * -1;
return dp[k][sum];
}
for ( int i = 1 ; i <= k ; ++i )
p[ind + 1][i] = p[ind][i];
int sol;
sol = bkt ( ind + 1, y );
for ( int i = 1 ; i <= k ; ++i )
p[ind + 1][i] = max ( p[ind][i], q[ind][i] );
return ( sol + bkt ( ind + 1, y | ( 1 << ind ) ) ) % MOD;
}
/// cowfooooouuuuuoooood