Cod sursa(job #858016)

Utilizator dtoniucDaniel Toniuc dtoniuc Data 18 ianuarie 2013 14:40:08
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <iostream>
#include <fstream>
#include <cstring>
#define MOD 30103
using namespace std;

int K,a,b,n;
int sol[2][210][110],aux[10];
char C[210];
int main()
{
    freopen ("diviz.in","r",stdin);
    freopen ("diviz.out","w",stdout);
    scanf("%d%d%d%s",&K,&a,&b,C);

    int l=strlen(C);
    for(int i=1,act=0;i<=l;i++,act=!act)
    {
        memset(sol[act],0,sizeof(sol[act]));
        for(int j=1;j<=l;j++)
        {
            if(i==1 && (C[j-1]-'0')!=0)
                sol[act][j][(C[j-1]-'0')%K]=1;
            for(int k=0;k<K;k++)
            {
                sol[act][j][(k*10+C[j-1]-'0')%K]+=sol[!act][j-1][k];
                if(sol[act][j][(k*10+C[j-1]-'0')%K]>=MOD)
                    sol[act][j][(k*10+C[j-1]-'0')%K]-=MOD;
            }
        }
        for(int k=0;k<K;k++)
        {
            memset(aux,0,sizeof(aux));
            for(int j=1;j<=l;j++)
            {
                sol[act][j][k]-=aux[C[j-1]-'0'];
                aux[C[j-1]-'0']+=sol[act][j][k];
                sol[act][j][k]+=sol[act][j-1][k];

                while (sol[act][j][k] >= MOD) sol[act][j][k] -= MOD;
                while (sol[act][j][k] < 0) sol[act][j][k] += MOD;
            }
        }
        if (i>=a && i<=b)
        {
            n+=sol[act][l][0];
            if (n>=MOD) n-=MOD;
        }
    }
    printf("%d",n);
    return 0;
}