Cod sursa(job #1769381)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 2 octombrie 2016 14:25:46
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <bits/stdc++.h>
#define Xp 30103
using namespace std;
ifstream fin("diviz.in");
ofstream fout("diviz.out");
int k, A, B,v[210],d1[210][110],d2[210][110],last[210][110][10];
char s[210];
int main() {
    fin >> k >> A >> B;
    fin >> (s+1);
    int n = strlen(s + 1);
    for (int i = 1; i <= n; i++) v[i] = s[i] - '0';
    d1[0][0] =d2[0][0] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++)
            for (int mod = 0; mod < k; mod++) {
                if (v[i] == 0 && j == 1) continue;
                d2[j][mod] -= last[j][mod][v[i]];
                if (d2[j][mod] < 0) d2[j][mod] += Xp;
                last[j][mod][v[i]] = 0;
            }
        for (int j = 1; j <= i; j++) {
            if (v[i] == 0 && j == 1) continue;
            for (int mod = 0; mod < k; mod++){
                    d2[j][(mod * 10 + v[i]) % k] = (d2[j][(mod * 10 + v[i]) % k] + d1[j-1][mod]) % Xp;
                    last[j][(mod * 10 + v[i]) % k][v[i]] += d1[j-1][mod];
                    last[j][(mod * 10 + v[i]) % k][v[i]] %= Xp;
            }
        }
        memcpy(d1, d2, sizeof d1);
    }
    int sol = 0;
    for (int i = A; i <= B; i++)
        sol = (sol + d1[i][0]) % Xp;
    fout << sol;
    return 0;
}