Cod sursa(job #2767832)

Utilizator DragosC1Dragos DragosC1 Data 7 august 2021 22:29:32
Problema Diviz Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <string>
#include <iostream>
#include <cstring>
using namespace std;
 
unsigned short k, a, b, n;
int nr[201];
 
const unsigned short MOD = 30103;

unsigned short rez;
 
unsigned short dp[2][101][201][10];

int main() {

    char ch;
    ifstream f("diviz.in");
    f >> k >> a >> b;
    while (f >> ch)
        nr[++n] = ch - '0';
    f.close();

    unsigned short i, j, r, new_rest, cif, t = 0;
    dp[0][0][0][0] = dp[1][0][0][0] = 1;
    for (i = 1; i <= n; i++) {
        t = 1 - t;
        for (j = 1; j <= n; j++)
            for (r = 0; r < k; r++)
                for (cif = 0; cif <= 9; cif++)
                    dp[t][r][j][cif] = (cif == nr[i] ? 0 : dp[1 - t][r][j][cif]);
        for (j = 1; j <= n; j++)
            for (r = 0; r < k; r++) {
                new_rest = (r * 10 + nr[i]) % k;
                if (j == 1 && new_rest == 0 && nr[i] == 0)
                    continue;
                for (cif = 0; cif <= 9; cif++)
                    dp[t][new_rest][j][nr[i]] = (dp[t][new_rest][j][nr[i]] + dp[1 - t][r][j - 1][cif]) % MOD;
            }
    }
    t = n % 2;
    for (i = a; i <= b; i++)
        for (cif = 0; cif <= 9; cif++)
            rez = (rez + dp[t][0][i][cif]) % MOD;

    ofstream g("diviz.out");
    g << rez;
    g.close();
    return 0;
}