Cod sursa(job #1164595)

Utilizator PatrikStepan Patrik Patrik Data 2 aprilie 2014 10:27:32
Problema Diviz Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
    #include<cstdio>
    #include<cstring>
    using namespace std;
    #define NMAX 205
    #define KMAX 101
    #define MOD 30103
    char s[NMAX];
    int dp[2][NMAX][KMAX] , first[10][NMAX] , u[10] , K ,A , B ,sol , N ;

    int main()
    {
        freopen("diviz.in" , "r" , stdin );
        freopen("diviz.out" , "w" , stdout );
        scanf("%d%d%d" , &K , &A , &B );
        scanf("%s" , s+1 );
        N = strlen(s+1);
        for(int i = N ; i>=0 ; i--)
        {
            for(int cif = 0 ; cif <= 9 ; ++ cif)
                first[cif][i] = u[cif];
            u[s[i]-48] = i;
        }

        for(int cif = 1 ; cif <= 9 ; ++ cif)
        {
            dp[1][first[cif][0]][cif%K] = 1;
            if(A == 1 && first[cif][0] && cif%K == 0)sol++;
        }
        for(int l = 2 ; l <= B ; ++l )
        {
            for(int i = N ; i ; i-- )
                for(int  r = 0 ; r < K ; ++r )
                {
                    for(int cif = 0 ; cif <= 9 ; ++ cif )
                    {
                        dp[l&1][first[cif][i]][(r*10+cif)%K] += dp[(l+1)&1][i][r];
                        if(dp[l&1][first[cif][i]][(r*10+cif)%K] >= MOD)
                            dp[l&1][first[cif][i]][(r*10+cif)%K] -= MOD;
                    }
                    dp[l&1][i][r] = 0;
                }
            if(l >= A)
            for(int i = 1 ; i<= N ; ++i )
            {
                sol += dp[l&1][i][0];
                if(sol >= MOD)sol-=MOD;
            }
        }
        printf("%d" , sol);
        return 0;
    }