Cod sursa(job #1855869)

Utilizator yosemiteYosemite yosemite Data 24 ianuarie 2017 01:18:11
Problema Diviz Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 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[3][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, lin = 1;
    for(int i = 1; i <= b; i++, lin = 1 - lin) {
        for(int j = i; j <= n; j++) {
            if(i >= a) {
                ans = (ans + dp[lin][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[1 - lin][prec[j + 1][c]][num];
                        x += dp[lin][j][r];
                        if(x > MOD) {
                            x -= MOD;
                        }
                        dp[1 - lin][prec[j + 1][c]][num] = x;
                    }
                }
            }
        }
        memset(dp[lin], 0, sizeof dp[lin]);
    }
    g << ans << "\n";
    return 0;
}