Cod sursa(job #268731)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 1 martie 2009 18:40:11
Problema Cowfood Scor 98
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.02 kb
# include <stdio.h>

const  int S=3210121;

int mat[50][50],aux[50],sol,n,s,nb,m,nr_moduri[10002][31];

void fill()
{
     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;
             }
}

int get_amount( int *v,  int n)
{
     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( int *d,  int *s,  int n)
{
      int i;
     for (i=1;i<=n;i++) d[i]=s[i];
}

void intersect( int *d,  int *s,  int n)
{
      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);
      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( int pos)
{
     int 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);
         //intersectam cu cel curent
         copy(safe,aux,n);
         intersect(aux,mat[pos],n);
         nb++;
         back(pos+1);
         nb--;
         copy(aux,safe,n);
         }
}

void scrie(int sol)
{
     FILE *g=fopen("cowfood.out","w");
     fprintf(g,"%ld\n",sol);
     fclose(g);
}
                   

int main()
{
    citire();
    fill();
    back(1);
    // int total=nr_moduri[s][n]+sol-(1+s*n);
    //total%=S;    
    //total-=sol;
    //while (total<0) total+=S;     total%=S;
    scrie(sol-(1+s*n));
    //getchar();
    return 0;
}