Pagini recente » Cod sursa (job #1990635) | Cod sursa (job #972854) | Cod sursa (job #763474) | Cod sursa (job #358767) | Cod sursa (job #3353441)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define MOD 3210121
#define SMAX 10000
#define NMAX 20
#define KMAX 30
using namespace std;
ifstream in("cowfood.in");
ofstream out("cowfood.out");
int comb[SMAX+KMAX+1][KMAX+1];
void precalc()
{
comb[0][0]=1;
for(int i=1; i<=SMAX+KMAX; i++)
{
comb[i][0]=1;
for(int j=1; j<=i && j<=KMAX; j++)
{
comb[i][j]=comb[i-1][j]+comb[i-1][j-1];
if(comb[i][j]>=MOD) comb[i][j]-=MOD;
}
}
}
int C(int n, int k) ///combinari de n luate cate k
{
if(n<k || n<0 || k<0) return 0;
else return comb[n][k];
}
int k, s, n;
int a[NMAX][KMAX];
long long ans=0;
void bkt(int bit, int nr_biti, vector<int> maxime) //PINEX
{
if(bit==n)
{
int sum=0;
for(int i=0; i<k; i++)
sum+=maxime[i];
int cnt=C(s-sum+k, k); //numarul de experimente care sunt invalidate de cele nr_biti experimente esuate alese de bkt
if(nr_biti&1) cnt=MOD-cnt;
//out << cnt << " -> " << sum << ": ";
//for(auto& i : maxime) out << i << " "; out << "\n";
ans+=cnt;
if(ans>=MOD) ans-=MOD;
return;
}
bkt(bit+1, nr_biti, maxime);
for(int j=0; j<k; j++)
{
maxime[j]=max(maxime[j], a[bit][j]);
}
bkt(bit+1, nr_biti+1, maxime);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
precalc();
in >> k >> s >> n;
for(int i=0; i<n; i++)
{
for(int j=0; j<k; j++)
in >> a[i][j];
}
vector<int> maxime(k, 0);
bkt(0, 0, maxime);
//out << ans << "\n";
ans-=1+k*s; ///eliminam cazurile in care nu sunt doua valori nenule
if(ans<0) ans+=MOD;
out << ans;
return 0;
}