Cod sursa(job #2472001)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 11 octombrie 2019 21:32:14
Problema Diviz Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <iostream>
#include <cstdio>
#include <set>

using namespace std;

typedef long long ll;
const int MOD = 30103;

int add(int a, int b)
{
    a += b;
    if (a >= MOD)
    {
        return a - MOD;
    }
    if (a < 0)
    {
        return a + MOD;
    }
    return a;
}

int mul(int a, int b)
{
    return a * (ll) b % MOD;
}

const int N = 200 + 7;
const int K = 100 + 7;

int dp[N][N][K]; /// dp[last][len][rest]
int n, k, a, b;
string s;
int c[N], last[10];
int ans;

int main()
{
    freopen ("diviz.in", "r", stdin);
    freopen ("diviz.out", "w", stdout);

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

    for (int i = 1; i <= n; i++)
    {
        c[i] = s[i - 1] - '0';
    }

    if (a == 1)
    {
        set <int> cifs;
        for (int i = 1; i <= n; i++)
        {
            if (c[i] % k == 0)
            {
                cifs.insert(c[i]);
            }
        }
        ans += (int) cifs.size();
        a++;
    }

    for (int i = 1; i <= n; i++)
    {
        if (c[i] && last[c[i]] == 0)
        {
            dp[i][1][c[i] % k] = 1;
        }
        for (int len = 2; len <= b; len++)
        {
            for (int r = 0; r < k; r++)
            {
                int nr = (r * 10 + c[i]) % k;
                for (int j = last[c[i]]; j < i; j++)
                {
                    dp[i][len][nr] = add(dp[i][len][nr], dp[j][len - 1][r]);
                }
            }
        }
        last[c[i]] = i;
    }

    for (int i = 1; i <= n; i++)
    {
        for (int len = a; len <= b; len++)
        {
            ans = add(ans, dp[i][len][0]);
        }
    }
    cout << ans << "\n";



    return 0;
}