Pagini recente » Cod sursa (job #735558) | Cod sursa (job #1996473) | Cod sursa (job #1407352) | Cod sursa (job #3311089) | Cod sursa (job #3345833)
#include <fstream>
#include <vector>
#define mod 3210121
using namespace std;
ifstream cin("cowfood.in");
ofstream cout("cowfood.out");
int a[21][31],dp[10002][31],maxi[31],ans,k,n,s;
vector<int>aux[31];
void bck(int pas,int last){
if(pas!=0){
int sum=0;
for(int j=1;j<=k;j++)
sum+=maxi[j];
if(sum>s)
return ;
sum=s-sum;
if(pas%2==0)
ans=(ans-dp[sum][k]+mod)%mod;
else
ans=(ans+dp[sum][k])%mod;
}
for(int i=last+1;i<=n;i++){
for(int j=1;j<=k;j++){
aux[j].push_back(maxi[j]);
maxi[j]=max(maxi[j],a[i][j]);
}
bck(pas+1,i);
for(int j=1;j<=k;j++){
maxi[j]=aux[j].back();
aux[j].pop_back();
}
}
}
signed main()
{
cin>>k>>s>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++)
cin>>a[i][j];
}
for(int j=1;j<=k;j++)
dp[0][j]=1;
for(int i=1;i<=s;i++)
for(int j=1;j<=k;j++)
dp[i][j]=(dp[i-1][j]+dp[i][j-1])%mod;
for(int i=1;i<=s;i++)
for(int j=1;j<=k;j++)
dp[i][j]=(dp[i][j]+dp[i-1][j])%mod;
bck(0,0);
/// nr total de permutari - permutarea (0,0,0 ..) - cele care au doar un eleme nenul
cout<<(dp[s][k]-1-1ll*s*k%mod-ans+2*mod)%mod;
return 0;
}