Cod sursa(job #2018564)

Utilizator robx12lnLinca Robert robx12ln Data 5 septembrie 2017 14:11:05
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<fstream>
#include<cstring>
#define MOD 30103
using namespace std;
ifstream fin("diviz.in");
ofstream fout("diviz.out");
int D[2][205][105], n, a, b, k, first[10][205];
int sol = 0;
char s[205];
inline int ok( int L ){
    if( a <= L && L <= b )
        return 1;
    return 0;
}
int main(){
    fin >> k >> a >> b;
    fin >> s;
    n = strlen( s );
    n--;
    memset( first, -1, sizeof( first ) );
    for( int i = 0; i <= 9; i++ ){
        for( int j = n; j >= 0; j-- ){
            if( s[j] == i + '0' )
                first[i][j] = j;
            else
                first[i][j] = first[i][j + 1];
        }
    }
    for( int i = 1; i <= 9; i++ ){
        if( first[i][0] != -1 )
            D[0][ first[i][0] ][ i % k ] = 1;
    }
    for( int L = 1; L <= b; L++ ){
        for( int i = 0; i <= n; i++ ){
            for( int r = 0; r < k; r++ ){
                if( r == 0 )
                    sol = ( sol + D[0][i][r] * ok( L ) ) % MOD;
                if( D[0][i][r] == 0 )
                    continue;
                for( int c = 0; c <= 9; c++ )
                    if( first[c][i + 1] != -1 && i + 1 <= n )
                        D[1][ first[c][i + 1] ][ ( r * 10 + c ) % k ] = ( D[1][ first[c][i + 1] ][ ( r * 10 + c ) % k ] + D[0][i][r] ) % MOD;
            }
        }
        memcpy( D[0], D[1], sizeof( D[1] ) );
        memset( D[1], 0, sizeof( D[1] ) );
    }
    fout << sol << "\n";
    return 0;
}