Cod sursa(job #7145)

Utilizator crusRus Cristian crus Data 21 ianuarie 2007 12:50:34
Problema Diviz Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.39 kb
#include <stdio.h>
#include <string.h>
#include <fstream.h>
#define input "diviz.in"
#define output "diviz.out"
#define nmax 202
#define rest 30103
int k,a,b,i,v[nmax],aux,nr[nmax],d[5];
long sol,n;
char c;
void read()
{
	FILE *fin;
	fin=fopen(input,"r");
	fscanf(fin,"%ld %ld %ld\n",&k,&a,&b);	
	n=0;
	while (!feof(fin))
		  {
		   fscanf(fin,"%c",&c);
		   v[++n]=(int)(c-'0');
		}
	v[0]=n;
	while (!v[0]) v[0]--;
	for (i=1;i<=v[0]/2;i++)
		{
		 aux=v[i];
		 v[i]=v[v[0]-i+1];
		 v[v[0]-i+1]=aux;
		}
	fclose(fin);
}
void aduna(int sursa[], int dest[])
{
 dest[1]+=sursa[1];
 for (i=2;i<=dest[0];i++)
	{
	 dest[i]=dest[i]+sursa[i]+(dest[i-1])/10;
	 dest[i-1]%=10;
	}
 dest[0]=dest[0]>sursa[0]?dest[0]:sursa[0];
 while (dest[dest[0]]>9)
	{
	 dest[0]++;
	 dest[dest[0]]=dest[dest[0]-1]/10;
	 dest[dest[0]-1]%=10;
	}
}
inline int calcul()
{
 int bun,lb=1; 
 for (i=1;i<=v[0];i++)
	 if (v[i]==nr[lb]) lb++;
 if (lb==nr[0]+1) bun=1;
    else bun=0;
 return bun;
}
void solve()
{
	short merge=1;

	d[1]=k%10;
	d[2]=(k%100)/10;
	d[3]=k/100;
	d[0]=3;
	while (!d[d[0]]) d[0]--;

	while (merge)
	{
		aduna(d,nr);
		if (nr[0]>=a&&nr[0]<=b)
			sol+=calcul();		
		if (nr[0]>b)
			merge=0;
	}
}
void write()
{
	FILE *fout;
	fout=fopen(output,"w");
	fprintf(fout,"%ld",sol%rest);
	fclose(fout);	
}
int main()
{
	read();
	solve();
	write();
	return 0;
}