Cod sursa(job #7335)

Utilizator blasterzMircea Dima blasterz Data 21 ianuarie 2007 13:27:52
Problema Diviz Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 0.98 kb
#include <cstdio>
#include <string>
#include <set>
using namespace std;
int n, k, aa, b, m, r;
long long nr;
char x[256];
int a[256];
int t[256];
set<int>Q;
void afis()
{
	int i;
	if(a[1]==0) return ;
	int t=0;
	//for(i=1;i<=r;i++) printf("%d", a[i]); printf("\n");
	for(i=1;i<=r;i++) t=t*10, t+=a[i];
	
	if(Q.find(t)!=Q.end()) return;
	Q.insert(t);
	if(t%k==0) nr++;
}
	
void back(int k)
{
	int i;
	//printf("*%d %d\n", k,r);
	//for(i=1;i<=r;i++) printf("%d ", a[i]);
	//printf("\n");
	if(k==r+1) afis();
	else
	{
		if(k==1)
		{for(i=0;i<m;i++)
		{
		
			a[k]=x[i];
			t[k]=i;
			back(k+1);
		}}
		else
		for(i=t[k-1]+1;i<m;i++)
		{
			a[k]=x[i];
			t[k]=i;
			back(k+1);
		}
	}
}

int main()
{
	freopen("diviz.in", "r", stdin);
	scanf("%d %d %d\n", &k, &aa, &b);
	gets(x);
	m=strlen(x);
	for(int i=0;i<m;i++) x[i]-='0';
	
	for(int i=aa;i<=b;i++) { r=i; back(1);}
freopen("diviz.out", "w", stdout);
	printf("%lld\n", nr%30103);
	return 0;
}