Pagini recente » Cod sursa (job #1222912) | Cod sursa (job #178800) | Cod sursa (job #162385) | Cod sursa (job #1882215) | Cod sursa (job #876479)
Cod sursa(job #876479)
#include<fstream>
#include<string.h>
#define mod 3210121
#define max_k 33
#define max_n 22
#define max_S 10010
using namespace std;
ifstream f("cowfood.in");
ofstream g("cowfood.out");
int i,j,V[max_k][max_S],C[max_n][max_k],p,nr,Fr[max_k],k,n,S,x,tot;
int solve(){
int A[max_k],sum=0;
memset(A,0,sizeof(A));
for(i=1;i<=n;i++){
if(Fr[i]==1){
for(j=1;j<=k;j++){
if(C[i][j]>A[j])
A[j]=C[i][j];
}
}
}
for(i=1;i<=k;i++)
sum+=A[i];
return V[k][S-sum];
}
int main(){
f>>k>>S>>n;
for(i=0;i<=S;i++)
V[1][i]=i+1;
for(i=2;i<=k;i++){
for(j=0;j<=S;j++){
if(i!=k)
V[i][j]=V[i-1][j];
else{
if(j!=0){
V[i][j]=V[i-1][j]-1;
V[i][j]-=(V[i-1][j]-V[i-1][j-1]);
}
}
if(j!=0&&i!=k){
V[i][j]+=V[i][j-1];
}
V[i][j]%=mod;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=k;j++)
f>>C[i][j];
}
p=1;
while(p<(1<<n)){
memset(Fr,0,sizeof(Fr));nr=0;
for(i=0;i<n;i++){
if(((p>>i)&1)==1){
nr++;
Fr[i+1]=1;
}
}
x=solve();
if(nr%2==1)
tot+=x;
else
tot-=x;
if(tot<0)
tot+=mod;
else
tot%=mod;
p+=1;
}
g<<V[k][S]-tot;
return 0;
}