Cod sursa(job #7120)

Utilizator moga_florianFlorian MOGA moga_florian Data 21 ianuarie 2007 12:36:07
Problema Diviz Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda 1, Clasele 11-12 Marime 1.12 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[nmax][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);

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++)
       if(!(l+1==1&&v[i]==0))
        {
        m[i][l+1][(q*10+v[i])%k]+=cst+m[i-1][l][q]-(ult[i][v[i]]?m[ult[i][v[i]]-1][l][q]:0);
        m[i][l+1][(q*10+v[i])%k]%=cst;        
        }

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

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