Cod sursa(job #2645191)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 27 august 2020 14:37:22
Problema Diviz Scor 60
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <bits/stdc++.h>
#define MOD 30103

using namespace std;

int k,a,b,fr[2][205][105],n, nxt[205][10];
string v;

void sum(int &a, int b){
    a += b;
    if (a >= MOD) a -= MOD;
}

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

    cin >> k >> a >> b >> v;

    n = v.size();

    for (int i=n;i>=0;i--){
        for (int j=0;j<=9;j++){
            if (v[i] - '0' == j) nxt[i][j] = i;
            else nxt[i][j] = (nxt[i+1][j] == 0 ? n+1 : nxt[i+1][j]);
        }
    }

    int ans = 0;

    for (int cif=1;cif<=9;cif++) fr[1][nxt[0][cif]][cif % k] = 1;

    for (int nr=1;nr<=b;nr++){
        for (int i=n;i>=0;i--){
            for (int j=0;j<k;j++){
                if (nr >= a && j==0){
                    sum (ans, fr[nr&1][i][j]);
                }
//                if (fr[nr&1][i][j]){
//                    cerr << nr << ' ' << i << ' ' << j << ' ' << ' ' << fr[nr&1][i][j] << '\n';
//                }
                for (int cif=0;cif<=9;cif++){
                    sum(fr[nr&1^1][nxt[i+1][cif]][(j * 10 + cif) % k], fr[nr&1][i][j]);
                }
                fr[nr&1][i][j] = 0;
            }
        }
    }


    cout << ans << '\n';

    return 0;
}