Pagini recente » Cod sursa (job #2271798) | Cod sursa (job #1722007) | Cod sursa (job #2218252) | Cod sursa (job #1973216) | Cod sursa (job #1754519)
#include <iostream>
#include<fstream>
using namespace std;
int n,i,sum,s,k,j,x,a[25][35],t[35],v[35],modes[35][10005],comb,nr,tot,suma[10005];
bool used[35];
const int mod=3210121;
void precalcdp(int nr)
{
for(i=0;i<=k;i++)
for(j=0;j<=s;j++)
{
modes[i][j]=0;
}
modes[nr][nr]=1;
for(i=nr;i<=k;i++)
for(j=0;j<=s;j++)
{
if(i>=1) modes[i][j]+=modes[i][j-1];
modes[i+1][j+nr]+=modes[i][j];
if(modes[i][j]>=mod) modes[i][j]-=mod;
}
}
int solve()
{
sum=0;
for(j=1;j<=k;j++)
{
sum+=t[j];
}
if(s-sum<0) return 0;
return suma[s-sum];
}
void bk(int x)
{
if(x>=comb+1)
{
for(int i=1;i<=k;i++) t[i]=0;
for(int i=1;i<=comb;i++)
{
for(j=1;j<=k;j++)
if(a[v[i]][j]>t[j])
t[j]=a[v[i]][j];
}
nr=solve();
if(comb%2==0) tot+=nr;
else tot-=nr;
if(tot>=mod) tot-=mod;
if(tot<0) tot+=mod;
}
else
{
for(int i=v[x-1]+1;i<=n;i++)
{
if(!used[i])
{
used[i]=1;
v[x]=i;
bk(x+1);
used[i]=0;
}
}
}
}
int main()
{
ifstream f("cowfood.in");
ofstream g("cowfood.out");
f>>n>>s>>k;
for(i=1;i<=n;i++)
{
for(j=1;j<=k;j++)
{
f>>a[i][j];
}
}
precalcdp(1);
for(i=1;i<=s;i++)
{
tot+=modes[k][i];
if(tot>=mod) tot-=mod;
}
precalcdp(0);
for(i=0;i<=n;i++)
{
suma[i]=modes[k][i];
if(i>=1) suma[i]+=suma[i-1];
}
for(comb=1;comb<=n;comb++)
{
bk(1);
}
g<<tot;
return 0;
}