Cod sursa(job #1404630)

Utilizator usermeBogdan Cretu userme Data 28 martie 2015 13:38:07
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <ctype.h>
#include <cstring>
#define MOD 30103

FILE*f=fopen("diviz.in","r");
FILE*h=fopen("diviz.out","w");

int firstcif[10][201];

int dp[10][101][201],curent[101][201];

int k,a,b,sol,nr;

char n[201];

int main(){
    fscanf(f,"%d%d%d\n%s",&k,&a,&b,&n);
    while ( isdigit(n[nr]) ){
        n[nr]-='0';
        ++nr;
    }
    for ( int i=0;i<nr;++i )
        for ( int j=0;j<=9;++j )
            firstcif[j][i]=-1;
    //--nr;
    for ( int i=0;i<nr;++i ){
        if ( i!=0 ){
            for ( int j=0;j<=9;++j )
                firstcif[j][i]=firstcif[j][i-1];
            firstcif[n[i-1]][i]=i-1;
        }
        //for ( int j=0;j<=9;++j )
        //    fprintf(h,"%d ",firstcif[i][j]);
        //fprintf(h,"\n");
    }
    for ( int i=0;i<nr;++i ){
        memset(curent,0,sizeof(curent));
        for ( int j=0;j<=9;++j ){
            if ( i!=0&&firstcif[j][i]>=firstcif[n[i]][i] )
                for ( int l=0;l<k;++l )
                    for ( int p=1;p<b;++p ){
                        curent[(l*10+n[i])%k][p+1]+=dp[j][l][p];
                        curent[(l*10+n[i])%k][p+1]%=MOD;
                    }
        }
        if ( n[i]!=0&&firstcif[n[i]][i]==-1 )
            curent[n[i]%k][1]=1;
        for ( int l=0;l<k;++l )
            for ( int p=1;p<b;++p )
                dp[n[i]][l][p]=(dp[n[i]][l][p]+curent[l][p])%MOD;
        //dp[n[i]][n[i]%k][1]=1;
        for ( int l=a;l<=b;++l ){
            sol+=curent[0][l];
            sol%=30103;
        }
    }
    fprintf(h,"%d",sol);
    return 0;
}