Pagini recente » Cod sursa (job #1466634) | Cod sursa (job #2880631) | Cod sursa (job #624815) | Cod sursa (job #3197226) | Cod sursa (job #937507)
Cod sursa(job #937507)
#include <fstream>
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
#define LE 10666
#define MOD 3210121
int result;
int a[66][66],n_pos,maxv[66];
int rest,k,s,n,i,j,t,total,nrbad;
bool viz[LE][LE];
int dp[LE][LE];
int memo(int i,int j)
{
if (viz[i][j]==true)
return dp[i][j];
viz[i][j]=true;
if (j>0)
dp[i][j]+=memo(i,j-1);
if (i>0)
dp[i][j]+=memo(i-1,j);
dp[i][j]%=MOD;
return dp[i][j];
}
int main()
{
f>>k>>s>>n;
dp[1][1]=1;
dp[0][1]=1;
viz[1][1]=true;
viz[0][1]=true;
for(i=1; i<=s; ++i)
for(j=1; j<=k; ++j)
if (viz[i][j]==false)
memo(i,j);
for(i=1; i<=n; ++i)
for(j=1; j<=k; ++j)
f>>a[i][j];
for(i=2;i<=s;++i)
{
dp[i][k]+=dp[i-1][k];
dp[i][k]%=MOD;
}
n_pos=(1<<n)-1;
for(i=1; i<=n_pos; ++i)
{
int parity=0;
total=0;
for(j=1; j<=k; ++j)
maxv[j]=0;
for(j=0; j<n; ++j)
if (i&(1<<j))
{
++parity;
for(t=1; t<=k; ++t)
maxv[t]=max(maxv[t],a[j+1][t]);
}
for(j=1; j<=k; ++j)
total+=maxv[j];
total=s-total;
if (total<=0)
continue;
if (parity%2)
nrbad+=dp[total][k];
else
nrbad-=dp[total][k];
nrbad=(nrbad+MOD)%MOD;
}
result=(dp[s-k][k]-nrbad-n+MOD+MOD+1)%MOD;
g<<result<<'\n';
f.close();
g.close();
return 0;
}