Pagini recente » Cod sursa (job #2216174) | Cod sursa (job #1663503) | Cod sursa (job #21914) | Cod sursa (job #2753429) | Cod sursa (job #2305770)
#include <fstream>
#include <vector>
#define nprim 3210121
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int k,s,n;
vector<vector<int> > combinari;
vector<vector<int> > esuate;
vector <int> esuate_sel;
void comb()
{
combinari.resize(s+k+10);
for(int i=0;i<combinari.size();++i)
{
combinari[i].resize(k+10,0);
combinari[i][0]=1;
if(i==0)
continue;
for(int j=1; j<=k && j<=i; ++j)
{
combinari[i][j]=combinari[i-1][j]+combinari[i-1][j-1];
combinari[i][j]%=nprim;
}
}
}
int main()
{
f>>k>>s>>n;
comb();
esuate.resize(n);
for(int i=0;i<n;++i)
{
esuate[i].resize(k);
for(int j=0;j<k;++j)
f>>esuate[i][j];
}
int ans=0;
for(int sub=0;sub<(1<<n);++sub)
{
if(!esuate_sel.empty())
esuate_sel.clear();
for(int i=0;i<n;++i)
if(sub&(1<<i))
esuate_sel.push_back(i);
int semn;
if(esuate_sel.size()%2)
semn=-1;
else semn=1;
int suma_maxime=0;
for(int i=0;i<k;++i)
{
int maxim=0;
for(int j=0;j<esuate_sel.size();++j)
if(esuate[esuate_sel[j]][i]>maxim)
maxim=esuate[esuate_sel[j]][i];
suma_maxime+=maxim;
}
int rest=s-suma_maxime;
ans=(ans+semn*combinari[k+rest][k]+nprim)%nprim;
//g<<sub<<' '<<ans<<'\n';
}
ans=(ans-(s*k+1)+nprim)%nprim;
g<<ans;
return 0;
}