Cod sursa(job #297631)

Utilizator katamashCatalin Tamas katamash Data 5 aprilie 2009 15:09:50
Problema Cowfood Scor 100
Compilator cpp Status done
Runda preONI Marime 2.73 kb
# include <stdio.h>      
     
const long int S=3210121;      
     
long int mat[50][50],aux[50],sol,n,s,m,nr_moduri[10002][31];      
     
void fill()      
{      
     long int sum,c;      
     for (c=1;c<=n;c++) nr_moduri[0][c]=1;      
     for (sum=1;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;      
             }      
}      
     
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)       
        {      
                // printf("%ld\n",nr_moduri[s-sum][n]);      
        return nr_moduri[s-sum][n];      
        }      
     return 0;      
}      
     
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);      
}      
           
void back(long int pos, long int nb)      
{      
     long int qwd,qwds,j,safe[31];      
     if (pos==m+1)      
        {      
        if (nb%2==0) sol+=get_amount(aux,n);      
         else sol-=get_amount(aux,n);      
         //normalizam sol;      
         while (sol<0) sol+=S;      
         sol%=S;      
         }      
     else      
         {      
         //nu intersectam cu cel curent      
         back(pos+1,nb);      
         //intersectam cu cel curent      
         copy(safe,aux,n);      
         intersect(aux,mat[pos],n);      
         back(pos+1,nb+1);      
         copy(aux,safe,n);      
         }      
}      
     
void scrie(long int sol)      
{      
     FILE *g=fopen("cowfood.out","w");      
     fprintf(g,"%ld\n",sol);      
     fclose(g);      
}      
                         
     
int main()      
{      
    citire();      
    fill();      
    back(1,0);      
    //long int total=nr_moduri[s][n]+sol-(1+s*n);      
    //total%=S;          
    //total-=sol;      
    //while (total<0) total+=S;     total%=S;      
    sol-=(1+s*n);      
    while (sol<0) sol+=S;      
    scrie(sol%S);      
    //getchar();      
    return 0;      
}