Cod sursa(job #464845)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 22 iunie 2010 10:12:30
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>

using namespace std;

#define file_in "diviz.in"
#define file_out "diviz.out"

#define nmax 212

int k,a,b,n;
char s[nmax];
int v[nmax];
int d[nmax][nmax/2][10];

void citire()
{
    freopen(file_in,"r",stdin);
    freopen(file_out,"w",stdout);

    scanf("%d %d %d\n", &k, &a, &b);
    gets(s+1);
    n=strlen(s+1);
    for (int i=1;i<=n;++i)
          v[i]=s[i]-'0';

}

#define mod 30103

void solve()
{
    int q,i,j,t,cif,c;
    for (q=1;q<=n;++q)
    {
        cif=v[q];
        for (i=n-1;i>=1;--i)
        {
             for (j=0;j<k;++j)
                  d[i+1][j][cif]=0;
             for (j=0;j<k;++j)
             {
                  t=(cif+j*10)%k;
                  for (c=0;c<10;++c)
                  {
                  d[i+1][t][cif]+=d[i][j][c];
                  if (d[i+1][t][cif]>=mod)
                      d[i+1][t][cif]%=mod;
                  }
             }
        }
        if (cif!=0)
        d[1][cif%k][cif]=1;
    }

    int suma=0;

    for (i=a;i<=b;++i)
         for (j=0;j<10;++j)
          {

             suma+=d[i][0][j];
              if (suma>=mod)
                  suma%=mod;
          }

    printf("%d\n", suma);

}

int main()
{
    citire();
    solve();

    fclose(stdin);
    fclose(stdout);

    return 0;
}