Cod sursa(job #268406)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 1 martie 2009 11:19:02
Problema Cowfood Scor 2
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.1 kb
# include <stdio.h>

const long int S=3210121;

long int mat[21][31],aux[31],n,s,m;

long int get_amount(long int *v, long int n)
{
     long int i,sum=0,prod=1,sol;
     for (i=1;i<=n;i++)
         {
         sum+=v[i];
         sum%=S;
         prod*=(v[i]+1);
         prod%=S;
         }
     sol=prod-sum-2;
     while (sol<0) sol+=S;
     sol%=S;
     return sol;
}

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();
    sol=calc();
    scrie(sol);
    //getchar();
    return 0;
}