Cod sursa(job #182416)

Utilizator pinkutzaRodykutz pinkutza Data 20 aprilie 2008 21:15:46
Problema Diamant Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.68 kb
#include<fstream.h>
long s;
long luat[44101],luatn[44101];
long rec[44101],recn[44101];
int main()
{
 long i,j,m,n,val;
 ofstream fout("diamant.out");
 ifstream fin("diamant.in");
 fin>>n>>m>>val;
 fin.close();


  

  
 long x[1000],dx=0;
 for(i=1;i<=n;i++)
  for(j=1;j<=m;j++)
   {
     dx++;
     x[dx]=i*j;
     s+=x[dx];
   }


  if(val>s)
  {
   fout<<0<<'\n';
   fout.close();
   return 0;
  }

 int min=0,max=0;
 luat[0]=1;

 for(i=1;i<=s;i++)
  luat[i]=luatn[i]=rec[i]=recn[i]=0;

 for(i=1;i<=dx;i++)
 {
  if(-min>max)
   max=-min;
  for(j=max;j>=0;j--)
  {
   if(luat[j]>0)
    {
     luat[j+x[i]]+=luat[j];
     luat[j+x[i]]=luat[j+x[i]]%10000;
     rec[j+x[i]]=1;
     if(j+x[i]>max)
      max=j+x[i];
    }

   if(luatn[j]>0)
    {
      if(-j+x[i]>=0)
       {
        luat[-j+x[i]]+=luatn[j];
        luat[-j+x[i]]=luat[-j+x[i]]%10000;
        if(max<-j+x[i])
         max=-j+x[i];
        rec[-j+x[i]]=1;
        if(-j+x[i]>max)
         max=-j+x[i];
       }
        else
         if(-j+x[i]<0)
         {
           luatn[j-x[i]]+=luatn[j];
           luatn[j-x[i]]=luatn[j-x[i]]%10000;
           recn[j-x[i]]=1;
           if(-j+x[i]<min)
            min=-j+x[i];
         }
           
    }
  }

  for(j=max;j>=0;j--)
  {
   if(luat[j]>0&&rec[j]==0)
   {
     if(j-x[i]>=0)
     {
      luat[j-x[i]]+=luat[j];
      luat[j-x[i]]=luat[j-x[i]]%10000;
     }
       else
       {
        luatn[x[i]-j]+=luat[j];
        luatn[-j+x[i]]=luat[-j+x[i]]%10000;
        if(j-x[i]<min)
         min=j-x[i];
       }
   }
     else
       rec[j]=0;

    if(luatn[j]>0&&recn[j]==0)
    {
     luatn[j+x[i]]+=luatn[j];
     luatn[j+x[i]]=luatn[j+x[i]]%10000;
     if(-j-x[i]<min)
      min=-j-x[i];
    }
      else
       recn[j]=0;

  }

}



  /*for(i=0;i<=s;i++)
   fout<<luat[i]<<" ";*/













 fout<<luat[val]<<'\n';
    

   
 fout.close();

 return 0;

}



















  /* for(i=1;i<=dx;i++)


    for(j=s;j>=0;j--)
    {
     if(luat[j]>0)
      {
       luat[j+x[i]]=(luat[j+x[i]]+luat[j])%10000;
       if(j-x[i]>=0)
        luat[j-x[i]]=(luat[j-x[i]]+luat[j])%10000;
         else
          {
           luatn[x[i]-j]=(luatn[x[i]-j]+luat[j])%10000;
           recn[x[i]-j]=1;
          }

      }
       

     if(luatn[j]>0&&recn[j]==0)
     {
       if(-j+x[i]>=0)
        luat[-j+x[i]]=(luat[-j+x[i]]+luatn[j])%10000;
         else
          luatn[-x[i]+j]=(luatn[-x[i]+j]+luatn[j])%10000;

        if(j+x[i]<=s)
         luatn[j+x[i]]=(luatn[j+x[i]]+luatn[j])%10000;

     }
       else
        recn[j]=0;
  }
  
   */