Cod sursa(job #1593734)

Utilizator CollermanAndrei Amariei Collerman Data 8 februarie 2016 20:30:36
Problema Diviz Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <fstream>
#include <cstring>
using namespace std;
ofstream fout("diviz.out");
ifstream fin("diviz.in");

const int NMAX = 205;
const int KMAX = 105;
const int MOD = 30103;

int A, B, K, LG, stare = 1, SOLFINAL;
int First[NMAX][10], FirstMod[KMAX][10], PD[2][NMAX][KMAX], Sol[KMAX];
char N[NMAX];

int main()
{
    fin >> K >> A >> B >> N;
    LG = strlen(N);

    for(int i = LG - 1; i >= 0; i--) {
        for(int cfr = 0; cfr <= 9; cfr++)
            First[i+1][cfr] = First[i+2][cfr];
        First[i+1][N[i] - '0'] = i + 1;
    }

    for(int cfr = 1; cfr <= 9; cfr++) {
        if(First[1][cfr])
            PD[0][First[1][cfr]][(N[First[1][cfr] - 1] - '0') % K]++;
        if((N[First[1][cfr] - 1] - '0') % K == 0)
            Sol[1]++;
    }

    for(int i = 0; i <= K - 1; i++)
        for(int cfr = 0; cfr <= 9; cfr++)
            FirstMod[i][cfr] = (i * 10 + cfr) % K;

    for(int currentLG = 2; currentLG <= B; currentLG++) {
        for(int i = currentLG - 1; i <= LG; i++)
            for(int r = 0; r <= K - 1; r++)
                if(PD[!stare][i][r])
                    for(int cfr = 0; cfr <= 9; cfr++)
                        if(First[i + 1][cfr]) {
                            PD[stare][First[i + 1][cfr]][FirstMod[r][cfr]] = (PD[stare][First[i + 1][cfr]][FirstMod[r][cfr]] + PD[!stare][i][r]) % MOD;
                                if(!FirstMod[r][cfr]) Sol[currentLG] = (Sol[currentLG] + PD[!stare][i][r]) % MOD; }

        stare =! stare;     // oh fuck no
        memset(PD[stare], 0, sizeof(PD[stare]));
    }

    for(int i = A; i <= B; i++)
        SOLFINAL = (SOLFINAL + Sol[i]) % MOD;
    fout << SOLFINAL << '\n';

    return 0;
}