Cod sursa(job #1359332)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 24 februarie 2015 22:09:45
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <fstream>
#include <cstring>
#define DIM 205
#define MOD 30103

using namespace std;

int K,A,B,N;
char s[DIM];
int D1[DIM][DIM],l[DIM][DIM][10],v[DIM],D2[DIM][DIM],sol;
ifstream fin("diviz.in");
ofstream fout("diviz.out");
int main(){
    fin>>K>>A>>B>>s+1;
    for(int i=1;s[i]!=0;i++)
        v[++N]=s[i]-'0';
    D1[0][0]=D2[0][0]=1;
    for(int i=1;i<=N;i++){
        for(int j=1;j<=i;j++)
            for(int d=0;d<K;d++){
                if(v[i]==0 && j==1)
                    continue;
                D2[j][d]-=l[j][d][v[i]];
                if(D2[j][d]<0)
                    D2[j][d]+=MOD;
                l[j][d][v[i]]=0;
            }
        for(int j=1;j<=i;j++){
            if(v[i]==0 && j==1)
                continue;
            for(int d=0;d<K;d++){
                D2[j][(d*10+v[i])%K]=(D2[j][(d*10+v[i])%K]+D1[j-1][d])%MOD;
                l[j][(d*10+v[i])%K][v[i]]=(l[j][(d*10+v[i])%K][v[i]]+D1[j-1][d])%MOD;
            }
        }
        memcpy(D1,D2,sizeof(D2));
    }
    for(int i=A;i<=B;i++)
        sol=(sol+D1[i][0])%MOD;
    fout<<sol<<"\n";
    fin.close();fout.close();
    return 0;
}