Cod sursa(job #1120532)

Utilizator Theorytheo .c Theory Data 25 februarie 2014 06:43:53
Problema Diviz Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <fstream>
#include <cstring>

using namespace std;

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

const int NMAX = 106;
const int MOD = 30103;

int K; int A; int B;int M;

int D[2][NMAX][NMAX]; int last[10]; int result;

char N[NMAX];

int main() {

    fin >> K >> A >> B;
    fin.get();
    fin.get(N + 1, NMAX, '\n');
    M = strlen(N + 1);
    int ant = 0;

    for(int i = 1; i <= M; ++i) { //cu i cifre

        ant = !ant;
        memset(D[ant], 0, sizeof(D[ant]));

        for(int j = 1; j <= M; ++j) { //pana in j, se termina cu j

            if(N[j] != '0' && i == 1) D[ant][j][ (N[j] - '0') % K] = 1;
            for(int k = 0 ; k < K; ++k) {
                D[ant][j][ (k * 10 + N[j] - '0') % K] += D[!ant][j - 1][k];

                if(D[ant][j][(k * 10 + N[j] - '0') % K] >= MOD)
                    D[ant][j][(k * 10 + N[j] - '0') % K] -= MOD;
            }
        }


        for(int k = 0 ;k < K; ++k) {

            memset(last, 0, sizeof(last));
            for(int j = 1; j <= M; ++j) {
                D[ant][j][k] -= last[ N[j] - '0'];
                last[N[j] - '0'] += D[ant][j][k];
                D[ant][j][k] += D[ant][j - 1][k];

                while(D[ant][j][k] >= MOD) D[ant][j][k] -= MOD;
                while(D[ant][j][k] < 0) D[ant][j][k] += MOD;
            }
        }

        if(A <= i && i <= B) {
                result = (result + D[ant][M][0]) % MOD;
        }
    }

    fout << result << '\n';
    return 0;
}