Pagini recente » Borderou de evaluare (job #2867936) | Borderou de evaluare (job #1852457) | Borderou de evaluare (job #223606) | Borderou de evaluare (job #2103239) | Cod sursa (job #892412)
Cod sursa(job #892412)
#include <fstream>
using namespace std;
const char InFile[]="cowfood.in";
const char OutFile[]="cowfood.out";
const int MaxK=31;
const int MaxS=10001;
const int MaxN=21;
const int MOD=3210121;
ifstream fin(InFile);
ofstream fout(OutFile);
struct Joint
{
int Iarba[MaxK];
};
int N,K,S,depth,sol,D[MaxK][MaxS];
int semn=1;
Joint X[MaxN];
void back(Joint Xp, bool use=false)
{
if(use)
{
int Sp=S;
for(register int i=1;i<=K;++i)
{
Sp-=Xp.Iarba[i];
}
if(Sp>=0)
{
sol+=semn*D[K+1][Sp+1];
if(sol>=MOD)
{
sol-=MOD;
}
else if(sol<0)
{
sol+=MOD;
}
}
}
++depth;
if(depth>N)
{
--depth;
return;
}
back(Xp,false);
for(register int i=1;i<=K;++i)
{
Xp.Iarba[i]=max(Xp.Iarba[i],X[depth].Iarba[i]);
}
semn*=-1;
back(Xp,true);
semn*=-1;
--depth;
}
int main()
{
fin>>K>>S>>N;
for(register int i=1;i<=N;++i)
{
for(register int j=1;j<=K;++j)
{
fin>>X[i].Iarba[j];
}
}
fin.close();
for(register int j=1;j<=S;++j)
{
D[0][j]=1;
}
for(register int i=1;i<=K;++i)
{
for(register int j=0;j<=S;++j)
{
D[i][j]=D[i-1][j]+D[i][j-1];
if(D[i][j]>=MOD)
{
D[i][j]-=MOD;
}
}
}
sol=(MOD+D[K][S]-S*K-1)%MOD;
back(X[0]);
fout<<sol;
fout.close();
return 0;
}