Pagini recente » Cod sursa (job #326508) | Cod sursa (job #1139399) | Cod sursa (job #857316) | Autentificare | Cod sursa (job #2270687)
#include<fstream>
#include<iostream>
#include<unordered_map>
#define DN 10005
using namespace std;
ifstream fin("cowfood.in");
ofstream fout("cowfood.out");
const int M=3210121;
int k,s,n,a[35][35],dp[35][DN],p,r[35][(1<<20)+5],pz[(1<<20)+5];
int poz,bit,semn,sum,rez;
int main()
{
fin>>k>>s>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=k;j++)
fin>>a[i][j];
for(int i=0;i<=s;i++)
dp[1][i]=i+1;
for(int i=2;i<=k;i++)
{
for(int j=0;j<=s;j++)
dp[i][j]=dp[i-1][j];
for(int j=1;j<=s;j++)
dp[i][j]=(dp[i][j]+dp[i][j-1])%M;
}
rez=(dp[k][s]+M-k*s-1)%M;
cout<<rez<<'\n';
p=(1<<n)-1;
for(int i=0;i<n;i++)
pz[(1<<i)]=i+1;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=p;j++)
{
bit=j&(-j);
poz=pz[bit];
r[i][j]=max(r[i][j^bit],a[i][poz]);
}
}
for(int j=1;j<=p;j++)
{
semn=1;
for(int i=1;i<=n;i++)
if(j&(1<<(i-1)))
semn=-semn;
sum=s;
for(int i=1;i<=k;i++)
{
sum-=r[i][j];
}
if(sum<0)
continue;
rez=(rez+M+semn*dp[k][sum])%M;
}
fout<<rez;
}