Cod sursa(job #1397825)

Utilizator felixiPuscasu Felix felixi Data 23 martie 2015 19:34:27
Problema Diviz Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream in("diviz.in");
ofstream out("diviz.out");

const int NMAX = 200;
const int KMAX = 100;
const int MOD  = 30103;

int d[2][NMAX+2][KMAX+2];
int v[NMAX+2], fir[11][NMAX+2], last[11], N,A,B,K, Ans;

inline bool is_digit( char c ) {
    return ( c > 47 && c < 59 );
}

void citire() {
    in >> K >> A >> B;
    char c = in.get();
    while( !is_digit(c) ) in.get(c);
    while( is_digit(c) ) {
        v[++N] = c - 48;
        in.get(c);
    }
    for( int i = N;  i >= 1;  --i ) {
        last[ v[i] ] = i;
        for( int j = 0;  j < 10;  ++j ) fir[j][i] = last[j];
    }
    for( int j = 0;  j < 10;  ++j ) fir[j][0] = last[j];
}


int main() {
    citire();


    d[0][0][0] = 1;
    for( int cf = 0;  cf < 10;  ++cf ) {
        int pos = fir[cf][0];
        if( pos ) {
            d[ 1 ][ pos ][ cf%K ] = 1;
        }
    }

    for( int lg = 1, ind = 1;  lg <= B;  ++lg, ind = 1-ind ) {
        memset( d[1-ind], 0, sizeof(d[1-ind]) );
        for( int i = 1;  i <= N;  ++i ) {
            for( int r = 0;  r < K;  ++r ) {
                for( int cf = 0;  cf < 10;  ++cf ) {
                    int pos = fir[cf][i+1];
                    if( pos ) {
                        int k = (10*r + cf) % K;
                        d[ 1-ind ][ pos ][ k ] += d[ ind ][ i ][ r ];
                        d[ 1-ind ][ pos ][ k ] %= MOD;
                    }
                }
            }
            if( A <= lg ) {
                Ans += d[ind][i][0];
                Ans %= MOD;
            }
        }
    }

    out << Ans << '\n';

    return 0;
}