Cod sursa(job #2087691)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 13 decembrie 2017 23:00:30
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <bits/stdc++.h>
#define MAXN 200
#define MAXK 100
#define MOD 30103

int d[2][1 + MAXN][1 + MAXK];
int firstapp[10][2 + MAXN];
int v[1 + MAXN];
int main(){
    FILE*fi,*fo;
    fi = fopen("diviz.in","r");
    fo = fopen("diviz.out","w");

    int k, a, b;
    fscanf(fi,"%d%d%d", &k, &a, &b);
    char c = fgetc(fi);
    while(!isdigit(c)) c = fgetc(fi);
    int n = 0;
    while(isdigit(c)){
        v[++n] = c - '0';
        c = fgetc(fi);
    }

    for(int i = n; i > 0; i--){
        for(int cf = 0; cf < 10; cf++)
            firstapp[cf][i] = firstapp[cf][i + 1];
        firstapp[v[i]][i] = i;
    }

    int ans = 0;
    for(int cf = 1; cf < 10; cf++)
        d[1][firstapp[cf][1]][cf % k] = 1;
    for(int len = 1; len <= b; len++){
        memset(d[(len + 1) & 1], 0, sizeof(d[(len + 1) & 1]));
        for(int i = len; i <= n; i++){
            for(int r = 0; r < k; r++)
                if(d[len & 1][i][r])
                    for(int cf = 0; cf <= 9; cf++)
                        if(firstapp[cf][i + 1] != 0){
                            d[(len + 1) & 1][firstapp[cf][i + 1]][(r * 10 + cf) % k] += d[len & 1][i][r];
                            if(d[(len + 1) & 1][firstapp[cf][i + 1]][(r * 10 + cf) % k] > MOD)
                                d[(len + 1) & 1][firstapp[cf][i + 1]][(r * 10 + cf) % k] -= MOD;
                    }
            if(len >= a){
                ans = ans + d[len & 1][i][0];
                if(ans > MOD)
                    ans -= MOD;
            }
        }

    }
    fprintf(fo,"%d", ans);

    fclose(fi);
    fclose(fo);
    return 0;
}