Pagini recente » Cod sursa (job #1762546) | Cod sursa (job #1884557) | Cod sursa (job #2131126) | Cod sursa (job #2374769) | Cod sursa (job #2305791)
#include <fstream>
#include <vector>
#define nprim 3210121
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int k,s,n;
int combinari[10035][35],esuate[25][35];
void comb()
{
combinari[0][0]=1;
for(int i=1; i<=s+k; ++i)
{
combinari[i][0]=1;
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 stiva[25];
int maxime[25][35];
int ans;
int semn=1;
void backtrack(int niv)
{
if(niv==n+1)
{
int suma_maxime=0;
for(int i=0;i<k;++i)
suma_maxime+=maxime[n][i];
int rest=s-suma_maxime;
if(rest<0) return ;
ans=(ans+semn*combinari[k+rest][k]+nprim)%nprim;
return;
}
stiva[niv]=0;
for(int i=0;i<k;++i)
{
maxime[niv][i]=maxime[niv-1][i];
}
backtrack(niv+1);
stiva[niv]=1;
semn*=-1;
for(int i=0;i<k;++i)
{
maxime[niv][i]=max(maxime[niv-1][i],esuate[niv-1][i]);
}
backtrack(niv+1);
semn*=-1;
}
int main()
{
f>>k>>s>>n;
comb();
for(int i=0; i<n; ++i)
{
for(int j=0; j<k; ++j)
f>>esuate[i][j];
}
for(int i=0;i<k;++i)
maxime[0][i]=0;
backtrack(1);
ans=(ans-(s*k+1)+nprim)%nprim;
g<<ans;
return 0;
}