Pagini recente » Cod sursa (job #344380) | Cod sursa (job #313687) | Cod sursa (job #927377) | Cod sursa (job #2641074) | Cod sursa (job #2305772)
#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;
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)
{
int semn=1;
vector <int> maxime(k,0);
int suma_maxime=0;
for(int i=0; i<n; ++i)
if(sub&(1<<i))
{
semn*=-1;
for(int j=0;j<k;++j)
if(esuate[i][j]>maxime[j])
{
suma_maxime+=(esuate[i][j]-maxime[j]);
maxime[j]=esuate[i][j];
}
}
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;
}