Pagini recente » Cod sursa (job #1771044) | Cod sursa (job #3200466) | Cod sursa (job #1281356) | Cod sursa (job #1344985) | Cod sursa (job #3220318)
#include <fstream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
ifstream fin ("cowfood.in");
ofstream fout("cowfood.out");
long long n,m,X,i,S,x,y,s,k,j,sol,D[10003][32],a[22][32],nr,M[32];
const long long MOD=3210121;
void backtrack(int pas)
{
long long aux[32];
if(pas==n+1)
{
if(!nr)
return;
s=0;
for(int j=1;j<=k;j++)
s+=M[j];
if(s>S)
return;
if(nr&1)
sol+=(D[S-s][k+1]%MOD);
else
sol-=(D[S-s][k+1]%MOD);
if(sol<0)
sol+=MOD;
sol%=MOD;
}
else
{
for(int i=0;i<=1;i++)
{
if(i)
{
for(int j=1;j<=k;j++)
{
aux[j]=M[j];
M[j]=max(M[j],a[pas][j]);
}
nr++;
}
backtrack(pas+1);
if(i)
{
for(int j=1;j<=k;j++)
M[j]=aux[j];
nr--;
}
}
}
}
int main()
{
fin>>k>>S>>n;
for(i=1;i<=n;i++)
for(j=1;j<=k;j++)
fin>>a[i][j];
for(j=0;j<=k+1;j++)
D[0][j]=1;
for(i=1;i<=S+1;i++)
for(j=0;j<=k+1;j++)
if(j<2)
D[i][j]=1;
else
if(i==1)
D[i][j]=j;
else
D[i][j]=(D[i-1][j]+D[i][j-1])%MOD;
backtrack(1);
sol=D[S][k+1]-sol;
if(sol<0)
sol+=MOD;
///scadem solutiile in care sunt toate valorile egale cu 0 (-1)
///si pe cele in care sunt k-1 valori egale cu 0. In acest caz se pun
///intre 1 si s bile in aceeasi cutie si de acea avem s*k
sol-=(S*k+1);
if(sol<0)
sol+=MOD;
fout<<sol;
return 0;
}