Pagini recente » Cod sursa (job #3176633) | Cod sursa (job #1252352) | Cod sursa (job #730100) | Cod sursa (job #1370181) | Cod sursa (job #2331150)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int MOD = 3210121;
const int combMax = 11000;
const int nMax = 21;
const int kMax = 31;
long long fact[combMax], invFact[combMax];
int power(int base, int exp)
{
if(exp == 0)
return 1;
if(exp % 2 == 0)
{
int x = power(base, exp / 2);
return (1LL * x * x) % MOD;
}
return (1LL * base * power(base, exp - 1)) % MOD;
}
inline int invers(int x)
{
return power(x, MOD-2);
}
int comb(int n, int k)
{
return (((fact[n] * invFact[k]) % MOD) * invFact[n-k]) % MOD;
}
int k, s, n;
int rasp = 0;
int a[nMax][kMax], mx[kMax];
void backtr(int pos, int last)
{
if(pos > 1)
{
int sign = 1;
if(pos % 2)
sign = -1;
int sum = 0;
for(int j = 1; j <= k; ++j)
sum = sum + mx[j];
if(sum <= s)
{
rasp += sign * comb(s - sum + k, k);
if(rasp < 0)
rasp += MOD;
rasp %= MOD;
}
}
if(pos <= n)
{
int t[k+1];
for(int i = last + 1; i <= n; ++i)
{
for(int j = 1; j <= k; ++j)
{
t[j] = mx[j];
if(a[i][j] > mx[j])
mx[j] = a[i][j];
}
backtr(pos+1, i);
for(int j = 1; j <= k; ++j)
mx[j] = t[j];
}
}
}
int main()
{
fact[0] = 1;
for(int i = 1; i < combMax; ++i)
{
fact[i] = (fact[i-1] * i) % MOD;
invFact[i] = invers(fact[i]);
}
ifstream in("cowfood.in");
in >> k >> s >> n;
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= k; ++j)
in >> a[i][j];
in.close();
backtr(1, 0);
rasp = comb(s+k, k) - rasp - 1 - s * k;
if(rasp < 0)
rasp += MOD;
rasp %= MOD;
ofstream out("cowfood.out");
out << rasp;
out.close();
return 0;
}