Cod sursa(job #7206)

Utilizator DorinOltean Dorin Dorin Data 21 ianuarie 2007 13:05:17
Problema Diviz Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.01 kb
# include <fstream.h>
# include <string.h>

# define input "diviz.in"
# define output "diviz.out"

# define max 202

char s[max];
long x[max],i,j,n,a,b,l,sol[max],rez,r;

void back(int k);

int main ()
{
	ifstream fin  ( input );
	ofstream fout ( output ) ;

	fin >> n >> a >> b;

	fin>>s;
	l = strlen(s);

	for(i = 1;i<=l;i++)
		x[i] = s[i-1] -'0';

	back(1);


	fout <<rez;

	return 0;
}
void verifica(int poz)
{
	for(r = 0 , j = 1; j<=poz; j++)
			r = ( 10*r + x[sol[j]]) % n ;

	if(r == 0)
		rez++;
	if(rez == 30103)
		rez = 0;
}
int ok(int k,int i)
{
	int gasit;
	if(k == 1 && x[i] == 0)
		return 0;
	for(int j = i-1;j>=k;j--)
		if(x[j] == x[i])
		{
			gasit = 0;
		for(int val= 1;val<k;++val)
			if(sol[val] == j)
				gasit =1;
			if(!gasit)
			return 0;
		}
	return 1;
}
void back(int k)
{
	if(k <= b)
	{
		if(k > a)
			verifica(k-1);
		for(int i = sol[k-1]+1;i<=l;i++)
		if(ok(k,i))
		{
			sol[k] = i;
			back(k+1);
		}
	}
	else
		verifica(k-1);
}