Cod sursa(job #7462)

Utilizator moga_florianFlorian MOGA moga_florian Data 21 ianuarie 2007 15:55:50
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
using namespace std;
#include<fstream>
#define nmax 205
#define kmax 105
#define lmax 205
#define cst 30103

int a,b,k;
int v[nmax],n;
char s[nmax];
int m[3][lmax][kmax];
int val[13][lmax][kmax];
int ult[nmax][12];
int crt[12];

int main()
{
ifstream fin("diviz.in");
ofstream fout("diviz.out");

fin>>k>>a>>b>>s;
int i,j,q,l;

for(i=0;s[i];i++)
  v[i+1]=s[i]-'0';
n=i;

memset(m,0,sizeof m);
memset(crt,0,sizeof crt);
memset(val,0,sizeof val);

for(i=1;i<=n;i++)
  {
  for(j=0;j<10;j++)
     {
     ult[i][j]=crt[j];              
     if(v[i]==j)
        crt[j]=i; 
     }
  }               

m[0][0][0]=1;

for(i=1;i<=n;i++)
  {
    for(l=0;l<=b;l++)
      for(q=0;q<=k;q++)
         m[1][l][q]=0;
  
    for(l=0;l<b;l++)
      for(q=0;q<k;q++)
       if(!(l+1==1&&v[i]==0))
        {
        m[1][l+1][(q*10+v[i])%k]+=cst+m[0][l][q]-val[v[i]][l][q];
        m[1][l+1][(q*10+v[i])%k]%=cst;        
        }

    for(l=0;l<=b;l++)
      for(q=0;q<k;q++)
        {
        val[v[i]][l][q]=m[0][l][q];
        m[1][l][q]+=m[0][l][q];        
        m[1][l][q]%=cst;
        }
      
    for(l=0;l<=b;l++)
      for(q=0;q<k;q++)
         m[0][l][q]=m[1][l][q];
  }
  

int sol=0;
for(i=a;i<=b;i++)
  sol+=m[0][i][0];
  
fout<<sol%cst<<"\n";  
  
fin.close();
fout.close();
return 0;
}