Pagini recente » Cod sursa (job #1208078) | Cod sursa (job #1634117) | Cod sursa (job #1549582) | Cod sursa (job #778350) | Cod sursa (job #2330573)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int MOD = 3210121;
const int combMax = 11000;
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] * invFact[n-k]) % MOD;
}
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");
int k, s, n;
in >> k >> s >> n;
vector<vector<int> > a(n, vector<int>(k));
for(int i = 0; i < n; ++i)
for(int j = 0; j < k; ++j)
in >> a[i][j];
in.close();
vector<int> mx(k);
int rasp = 0;
for(int i = 1; i < (1 << n); ++i)
{
int nr = 0;
fill(mx.begin(), mx.end(), 0);
for(int j = 0; j < n; ++j)
if((i & (1 << j)) != 0)
{
nr++;
//folosim experimentul j
for(int t = 0; t < k; ++t)
if(a[j][t] > mx[t])
mx[t] = a[j][t];
}
int sign = 1;
if(nr % 2 == 0)
sign = -1;
int sum = 0;
for(int j = 0; j < k; ++j)
sum = sum + mx[j];
if(sum <= s)
{
rasp += sign * comb(s - sum + k, k);
if(rasp < 0)
rasp += MOD;
rasp %= MOD;
}
}
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;
}