Cod sursa(job #1855867)

Utilizator yosemiteYosemite yosemite Data 24 ianuarie 2017 01:12:33
Problema Diviz Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("diviz.in");
ofstream g("diviz.out");
const int nMax = 203;
const int MOD = 30103;
char s[nMax];
int prec[nMax][13], dp[nMax][nMax][103], cif[nMax], v[nMax];
int main()
{
    int k, a, b;
    f >> k >> a >> b;
    f >> (s + 1);
    int n = strlen(s + 1);
    for(int i = 1; i <= n; i++) {
        cif[i] = s[i] - '0';
    }
    for(int i = n; i >= 1; i--)
    {
        v[cif[i]] = i;
        for(int j = 0; j <= 9; j++)
            prec[i][j] = v[j];
    }
    for(int i = 1; i <= 9; i++) {
        if(prec[1][i]) {
            dp[1][prec[1][i]][i % k] = 1;
        }
    }
    int num = 0, ans = 0;
    for(int i = 1; i <= b; i++) {
        for(int j = i; j <= n; j++) {
            if(i >= a) {
                ans = (ans + dp[i][j][0])%MOD;
            }
            for(int r = 0; r <= k; r++) {
                for(int c = 0; c <= 9; c++) {
                    if(prec[j + 1][c]) {
                        num = (r * 10 + c) % k;
                        int x = dp[i + 1][prec[j + 1][c]][num];
                        x += dp[i][j][r];
                        if(x > MOD) {
                            x -= MOD;
                        }
                        dp[i + 1][prec[j + 1][c]][num] = x;
                    }
                }
            }
        }
    }
    g << ans << "\n";
    return 0;
}