Cod sursa(job #2982548)

Utilizator pielevladutPiele Vladut Stefan pielevladut Data 20 februarie 2023 14:01:42
Problema Diviz Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <bits/stdc++.h>

using namespace std;

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

const int mod = 30103;

int dp[205][205][105];
int first[14][205];
/// dp[j][i][r] -> numarul de subsiruri distincte de lungime j care contin ultima cifra cea de-a i-a cifra
/// a numarului n, subsiruri care sa dea restul r prin impartirea la k

int k;
int a, b;
char s[205];

int main()
{
    fin >> k;
    fin >> a >> b;
    fin.get();
    fin >> (s + 1);
    int n = strlen(s + 1);
    for(int cifra = 0; cifra <= 9; cifra ++)
    {
        int last = n + 1;
        for(int i = n; i >= 1; i --)
        {
            int v = (s[i] - '0');
            if(v == cifra)
            {
                first[cifra][i] = i;
                last = i;
            }
            else
            {
                first[cifra][i] = last;
            }
        }
    }
    for(int cifra = 1; cifra <= 9; cifra ++)
    {
        dp[1][first[cifra][1]][cifra % k] = 1;
    }
    for(int j = 1; j < b; j ++)
    {
        for(int i = 1; i < n; i ++)
        {
            for(int rest = 0; rest < k; rest ++)
            {
                for(int cifra = 0; cifra <= 9; cifra ++)
                {
                    if(first[cifra][i + 1] != n + 1)
                    {
                        dp[j + 1][first[cifra][i + 1]][(rest * 10 + cifra) % k] += dp[j][i][rest];
                        dp[j + 1][first[cifra][i + 1]][(rest * 10 + cifra) % k] %= mod;
                    }
                }
            }
        }
    }
    int r = 0;
    for(int nrCif = a; nrCif <= b; nrCif ++)
    {
        for(int i = 1; i <= n; i ++)
        {
            r += dp[nrCif][i][0];
            r %= mod;
        }
    }
    fout << r << '\n';
    return 0;
}