Cod sursa(job #22174)

Utilizator pocaituDavid si Goliat pocaitu Data 25 februarie 2007 21:43:16
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include<fstream.h>
#include<string.h>
unsigned int long n,sol[22][22],sol1[22][22],nr[202],k,s[202],a,b;



void citire()
{char s1[202],i;
 ifstream f("diviz.in");
 f>>k>>a>>b;
 f>>s1;
 n=strlen(s1);
 for(i=1;i<=strlen(s1);i++)
  s[i]=s1[i-1]-'0';
 f.close();
 }






void initializare()
{unsigned int i,viz[202],j;
 memset(viz,0,sizeof(viz));
 viz[0]=1;
 for(i=1;i<=n;i++)
  {if(!viz[s[i]])
	{viz[s[i]]=1;
	 sol1[i][s[i]%k]+=1;
	 }
   for(j=0;j<k;j++)
	 sol1[i][j]+=sol1[i-1][j];
   }
 nr[1]=sol1[n][0];
 }







void dinamica()
{unsigned int last[10],m,i,j,ddd;

 for(m=2;m<=b;m++)
  {memset(last,0,sizeof(last));
   for(i=0;i<=n;i++)
	memset(sol[i],0,sizeof(sol[i]));
   for(i=0;i<=n;i++)
	 {for(j=0;j<k;j++)
	   {ddd=(j*10+s[i+1])%k;
		sol[i+1][ddd]=(sol[i+1][ddd]+sol1[i][j]-sol1[last[s[i+1]]][j]);//%30103;
		sol[i+1][j]=(sol[i+1][j]+sol[i][j]);//%30103;
		}

	  sol1[i][j]=(sol1[i][j]+sol1[last[s[i+1]]][j]);//%30103;
	  last[s[i+1]]=i;
	   }

	nr[m]=sol[n][0];
	for(i=0;i<=n;i++)
	memcpy(sol1[i],sol[i],sizeof(sol[i]));
	}
 }


void afisare()
{int i;
 ofstream g("diviz.out");
 for(i=a+1;i<=b;i++)
   nr[a]+=nr[i];
 for(i=0;i<a;i++)
   nr[a]-=nr[i];
 g<<nr[a];
 g.close();
 }






int main()
{citire();
 initializare();
 dinamica();
 afisare();
 return 0;
 }