Pagini recente » Cod sursa (job #1571963) | Cod sursa (job #637158) | Cod sursa (job #1214312) | Cod sursa (job #2880258) | Cod sursa (job #3219632)
#include <fstream>
#define mod 3210121
#include <cstring>
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
int k,s,n,d[50][10001],dp[50][10001],Max[50],nr1,scz,sol[50];
struct numar
{
int v[50];
}nr[50];
void backt(int pas)
{
int v[31];
for(int j=1;j<=k;j++)
{
if(sol[pas-1]==1)
Max[j]=max(Max[j],nr[pas-1].v[j]);
v[j]=Max[j];
}
if(pas==n+1)
{
if(nr1==0)
return;
int val=0;
for(int j=1;j<=k;j++)
{
val=val+Max[j];
}
if(s>=val)
{
val=dp[k][s-val];
if(nr1%2==0)
val=-val;
scz=(scz+val+mod)%mod;
}
}
else
{
for(int j=0;j<=1;j++)
{
if(j==0)
{
backt(pas+1);
}
else
{
nr1++;
sol[pas]=1;
for(int i=1;i<=k;i++)
{
Max[i]=max(Max[i],nr[pas].v[i]);
}
backt(pas+1);
for(int i=1;i<=k;i++)
Max[i]=v[i];
nr1--;
sol[pas]=0;
}
}
}
}
int main()
{
fin>>k>>s>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=k;j++)
{
fin>>nr[i].v[j];
}
}
for(int i=0;i<=k+1;i++)
d[i][0]=1;
for(int i=1;i<=s;i++)
{
for(int j=1;j<=k+1;j++)
{
d[j][i]=(d[j][i]+d[j-1][i]+d[j][i-1]);
dp[j-1][i]=d[j][i];
}
}
backt(1);
int rasp=(dp[k][s]-s*k-1+7*mod)%mod;
rasp=(rasp-scz+mod)%mod;
fout<<rasp;
return 0;
}