Cod sursa(job #1838197)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 31 decembrie 2016 13:42:02
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <string>
#define MAXSIZE 200
#define MAXK 100
#define MOD 30103
using namespace std;

int D[2][MAXSIZE + 1][MAXK + 1];
int mod10[MAXSIZE + 1];
string N;

int aup, aud;

void precalc() {
    mod10[0] = 1;
    for (int i = 1 ; i <= MAXSIZE ; ++i) {
        mod10[i] = 10 * mod10[i - 1];
        if (mod10[i] >= MOD)
            mod10[i] %= MOD;
    }
}

inline int prodmod(int x, int y, int mod) {
    aup = x * y;
    if (aup >= mod)
        aup %= mod;

    return aup;
}

inline int minusmod(int x, int y, int mod) {
    aud = x - y;
    if (aud < 0)
        aud += mod;

    return aud;
}

int main () {
    ifstream cin("diviz.in");
    ofstream cout("diviz.out");

    int k, a, b;
    cin >> k >> a >> b >> N;
    int n = N.size();

    precalc();

    D[0][1][(N[n - 1] - '0') % k] = 1;

    for (int i = n - 2 , l = 1 ; i >= 0 ; --i, l ^= 1) {
        D[l][1][(N[i] - '0') % k] = 1;

        for (int j = 2 ; j <= n - i ; ++j)
            for (int t = 0 ; t < k ; ++t) {
                D[l][j][t] = D[1 - l][j][t] + D[1 - l][j - 1][minusmod(t, prodmod(N[i] - '0', mod10[j - 1], k), k)];
                if (D[l][j][t] >= MOD)
                    D[l][j][t] -= MOD;
            }
    }

    int sol = 0;
    for (int j = a ; j <= b ; ++j) {
        sol += D[!(n & 1)][j][0];
        if (sol >= MOD)
            sol -= MOD;
    }

    cout << sol << "\n";
    return 0;
}