Cod sursa(job #290171)

Utilizator flamecataCiobanu Alexandru-Catalin flamecata Data 27 martie 2009 16:31:34
Problema Cowfood Scor 100
Compilator cpp Status done
Runda aa Marime 2.43 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;   
}