Pagini recente » Cod sursa (job #1494604) | Cod sursa (job #3269572) | Cod sursa (job #864542) | Cod sursa (job #6515) | Cod sursa (job #2408423)
#include<bits/stdc++.h>
#define mod 3210121
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int k, s, n;
int nr[35][35];
int combi[10035][35];
int prf[10035][35];
int mx[35];
void comb()
{
combi[0][0] = combi[1][0] = combi[1][1] = 1;
for(int i = 2; i <= 10000; ++i)
{
combi[i][0] = 1;
for(int j = 1; j <= 33; ++j)
{
combi[i][j] = (combi[i-1][j] + combi[i-1][j-1]);
if(combi[i][j] >= mod)
combi[i][j] -= mod;
}
}
for(int i = 0; i <= k; ++i)
for(int j = i; j <= 10030; ++j)
{
prf[j][i] = prf[j-1][i] + combi[j][i];
if(prf[j][i] >= mod)
prf[j][i] -= mod;
}
}
int main()
{
f >> k >> s >> n;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= k; ++j)
f >> nr[i][j];
comb();
long long ans = 0;
for(int j = s; j >= 2; --j)
{
ans = ans + combi[j + k - 1][k - 1] - k + mod;
while(ans >= mod)
ans -= mod;
}
for(int i = 1; i < (1<<n); ++i)
{
memset(mx, 0, sizeof(mx));
int bb = 0;
for(int j = 0; j < n; ++j)
if(i & (1<<j))
{
++bb;
for(int p = 1; p <= k; ++p)
mx[p] = max(mx[p], nr[j+1][p]);
}
int ss = 0;
for(int p = 1; p <= k; ++p)
ss += mx[p];
if(ss <= s)
{
bool sc = 1;
if(bb ^ 1)
sc = 0;
int pp = prf[s - ss + k - 1][k - 1];
if(sc)
{
ans -= pp;
if(ans < 0)
ans += mod;
}
else
{
ans += pp;
if(ans >= mod)
ans -= mod;
}
}
}
g << ans;
return 0;
}