Pagini recente » Cod sursa (job #2257218) | Cod sursa (job #2206645) | Cod sursa (job #1353044) | Cod sursa (job #155933) | Cod sursa (job #268539)
Cod sursa(job #268539)
# include <stdio.h>
const long int S=3210121;
long int mat[50][50],aux[50],n,s,m,nr_moduri[10002][31];
void fill()
{
long int sum,c;
for (c=0;c<=n;c++) nr_moduri[0][c]=1;
for (sum=0;sum<=s;sum++) nr_moduri[sum][0]=1;
for (sum=1;sum<=s;sum++)
for (c=1;c<=n;c++)
{
nr_moduri[sum][c]=nr_moduri[sum][c-1]+nr_moduri[sum-1][c];
nr_moduri[sum][c]%=S;
}
}
void scrie_mat()
{
long int i,j;
for (i=0;i<=n;i++)
{
for (j=0;j<=20;j++) printf("%ld ",nr_moduri[j][i]);
printf("\n");
}
}
long int get_amount(long int *v, long int n)
{
long int i,sum=0;
for (i=1;i<=n;i++)
sum+=v[i];
if (sum<=s) return nr_moduri[s-sum][n]%S;
return 0;
}
void scrie_v(long int *v, long int n)
{
long int i;
for (i=1;i<=n;i++) printf("%ld ",v[i]);
printf("\n");
}
void copy(long int *d, long int *s, long int n)
{
long int i;
for (i=1;i<=n;i++) d[i]=s[i];
}
void intersect(long int *d, long int *s, long int n)
{
long int i;
for (i=1;i<=n;i++)
if (s[i]>d[i]) d[i]=s[i];
}
void citire()
{
FILE *f=fopen("cowfood.in","r");
fscanf(f,"%ld%ld%ld",&n,&s,&m);
long int i,j;
for (i=1;i<=m;i++)
for (j=1;j<=n;j++) fscanf(f,"%ld",&mat[i][j]);
fclose(f);
}
long int calc()
{
long int qwd,qwds,j,nb,sol=0;
for (qwd=1;qwd<=((long int)1<<n)-1;qwd++)
{
//pe primul bit tre' sa pui primul vector
j=1;
qwds=qwd;
while (qwds%2==0)
{
qwds/=2;
j++;
}
nb=1;
copy(aux,mat[j],n);
while (qwds)
{
qwds/=2;
j++;
if (qwds%2)
{
intersect(aux,mat[j],n);
nb++;
}
}
//scrie_v(aux,n);
//adunam la solutie ce trebuie
if (nb%2==0) sol-=get_amount(aux,n);
else sol+=get_amount(aux,n);
//normalizam sol;
while (sol<0) sol+=S;
sol%=S;
}
return sol;
}
void scrie(long int sol)
{
FILE *g=fopen("cowfood.out","w");
fprintf(g,"%ld\n",sol);
fclose(g);
}
int main()
{
long int sol;
citire();
fill();
//scrie_mat();
sol=calc();
long int total=nr_moduri[s][n]-nr_moduri[s][0]-(nr_moduri[s][1]-1)*n;
while (total<0) total+=S; total%=S;
total-=sol;
while (total<0) total+=S; total%=S;
scrie(total);
//getchar();
return 0;
}