Cod sursa(job #6893)

Utilizator DragoshZZabava Dragos DragoshZ Data 21 ianuarie 2007 10:34:24
Problema Diviz Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.23 kb
#include<iostream.h>
#include<fstream.h>
#include<string.h>

fstream f("diviz.in",ios::in);
fstream g("diviz.out",ios::out);
int x[201],k,kk,a,da,b,as,ev,l,nr,nrs;
char s[201] ;
/*void cifre(int &l)
{ int c,i=0;
 c=n;
 while (c)
	{ s[++i]=c%10;
	 c/=10;
	}
 l=i;
 int aux;
 for(i=1;i<=l/2;i++)
	{ aux=s[i];
	 s[i]=s[n-i+1];
	 s[n-i+1]=aux;
	}
}  */

void init()
{ x[k]=-1;
      /*	if(da) {nr--;da=0;}  */
}

int succesor()
{ if(x[k]<1&&k<=l)
	{x[k]++;
    /*	if(x[k]==1)
		{nr++;da=1;}
	else
		da=0;*/
	return 1;}
 else
	return 0;
}

int valid()
{  return (k<=l);
}

int solutie()
{ int sum=0,i,nr=0;
	for(i=1;i<=l;i++)
		if(x[i])
			nr++;
if((nr>=a)&&(nr<=b))
     {for(i=1;i<=l;i++)
	if(x[i])
		sum=(sum*10)+(s[i-1]-'0');
     if(sum%kk==0)
	return 1;
     else
      return 0;
     }
 else
	return 0;
}

void back()
{  k=1;
   nr=0;
   nrs=0;
  /* da=0;*/
   init();
   while(k)
   {   do
	{  as=succesor();
	  if(as)
		ev=valid();
	}
      while(as&&!ev);
      if(as)
	if(solutie())
		nrs++;
	else
		{k++,init();}
      else
	k--;

   }
}

int main()
{ f>>kk>>a>>b;
f.get();
f.get(s,201);
l=strlen(s);
back();
g<<(nrs&30103);
f.close();
g.close();
return 0;
}