Cod sursa(job #2018561)

Utilizator robx12lnLinca Robert robx12ln Data 5 septembrie 2017 14:07:48
Problema Diviz Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 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];
long long 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 += D[0][i][r] * ok( L );
                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[0][i][r];
            }
        }
        memcpy( D[0], D[1], sizeof( D[1] ) );
        memset( D[1], 0, sizeof( D[1] ) );
    }
    fout << sol << "\n";
    return 0;
}