Pagini recente » Clasament Summer Challenge 2009, Runda 3 | Cod sursa (job #369718) | Cod sursa (job #1870992) | Cod sursa (job #2959147) | Cod sursa (job #2180807)
#include <fstream>
#define MOD 3210121
#define MAX_N 20
#define MAX_K 30
#define MAX_S 10000
#define MAX_COMB 50
using namespace std;
typedef long long lint;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int k, s, n;
int total;
int comb[MAX_S + MAX_K + 1][MAX_K + 1];
int stars[MAX_S + 1];
int a[MAX_N + 1][MAX_K + 1];
void readFile()
{
f >> k >> s >> n;
int i, j;
for(i = 1; i <= n; i ++)
{
for(j = 1; j <= k; j ++)
f >> a[i][j];
}
f.close();
}
void getComb()
{
int i, j;
for(i = 0; i <= s + k; i ++)
{
int mn = min(i, k);
for(j = 0; j <= mn; j ++)
comb[i][j] = 0;
}
comb[0][0] = 1;
for(i = 1; i <= s + k; i ++)
{
int mn = min(i, k);
comb[i][0] = 1;
for(j = 1; j <= mn; j ++)
{
comb[i][j] = comb[i - 1][j] + comb[i - 1][j - 1];
if(comb[i][j] >= MOD)
comb[i][j] -= MOD;
}
}
}
void getStars()
{
int i;
stars[0] = 1;
for(i = 1; i <= s; i ++)
{
stars[i] = stars[i - 1] + comb[i + k - 1][k - 1];
if(stars[i] >= MOD)
stars[i] -= MOD;
}
total = stars[s] - (s * k + 1) % MOD;
if(total < 0)
total += MOD;
}
int rez;
int mn[MAX_N + 1][MAX_K + 1];
int stkLen;
int stk[MAX_N + 1];
void getPinex()
{
if(stkLen != 0)
{
int i, j, h;
int sign = stkLen;
for(h = 1; h <= k; h ++)
mn[stkLen][h] = max(mn[stkLen - 1][h], a[stk[stkLen]][h]);
int sum = s;
for(j = 1; j <= k; j ++)
sum -= mn[stkLen][j];
if(sum >= 0)
{
if(sign & 1)
rez += stars[sum];
else
rez -= stars[sum];
if(rez < 0)
rez += MOD;
if(rez >= MOD)
rez -= MOD;
}
}
for(int i = stk[stkLen] + 1; i <= n; i ++)
{
stk[++ stkLen] = i;
getPinex();
stkLen --;
}
}
void getRez()
{
rez = total - rez;
if(rez < 0)
rez += MOD;
}
void solve()
{
getComb();
getStars();
getPinex();
getRez();
}
void printFile()
{
g << rez << "\n";
g.close();
}
int main()
{
readFile();
solve();
printFile();
return 0;
}