Pagini recente » Cod sursa (job #2011155) | Cod sursa (job #40518) | Cod sursa (job #2943338) | Cod sursa (job #1193876) | Cod sursa (job #1754768)
#include <iostream>
#include<fstream>
#include<bitset>
#include<cassert>
using namespace std;
int n,i,sum,s,k,j,x,a[25][35],t[25][35],v[35],modes[35][10005],comb,nr,tot,suma[10005],num,len;
bitset<(1<<20)+5> viz;
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=nr;j<=s;j++)
{
if(i>=1) modes[i][j]+=modes[i][j-1];
modes[i][j]%=mod;
modes[i+1][j+nr]+=modes[i][j];
}
}
int solve()
{
sum=0;
for(j=1;j<=k;j++)
{
sum+=t[len][j];
}
assert(suma[s-sum]<mod);
if(s-sum<0) return 0;
return suma[s-sum];
}
void bk(int x)
{
if(nr!=0)
{
viz[nr]=1;
for(j=1;j<=k;j++)
t[len][j]=max(t[len-1][j],a[v[x-1]][j]);
num=solve();
if(len%2==0) tot+=num;
else tot-=num;
if(tot>=mod) {tot-=mod;}
if(tot<0) tot+=mod;
assert(tot<mod);
}
for(int i=v[x-1]+1;i<=n;i++)
{
if((nr&(1<<(i-1)))==0&&viz[nr+(1<<(i-1))]==0)
{
nr+=(1<<(i-1));
v[x]=i;
len++;
bk(x+1);
len--;
nr-=(1<<(i-1));
}
}
}
int main()
{
ifstream f("cowfood.in");
ofstream g("cowfood.out");
f>>k>>s>>n;
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];
tot%=mod;
}
precalcdp(0);
for(i=0;i<=s;i++)
{
suma[i]+=modes[k][i];
if(i>=1) suma[i]+=suma[i-1];
suma[i]%=mod;
}
nr=0;len=0;
bk(1);
g<<tot;
return 0;
}