Cod sursa(job #182366)

Utilizator pinkutzaRodykutz pinkutza Data 20 aprilie 2008 19:27:39
Problema Diamant Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.86 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 max;

  

  
 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;
  }

   
 long min;
 max=0;min=0;
 luat[0]=1;
 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]==1)
    {
      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]==1&&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]==1&&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;

  }

}

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

   
 fout.close();

 return 0;

}