Cod sursa(job #2087633)

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

int d[10 + MAXN][1 + MAXN][1 + MAXK];
int lastcif[10];
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);

    for(int i = 0; i < 10; i++)
        lastcif[i] = 205;

    int n = 0;
    d[0][0][0] = 1;
    while(isdigit(c)){
        int x = c - '0';
        n++;
        for(int len = 0; len <= b; len++)
            for(int r = 0; r < k; r++)
                d[n][len][r] = d[n - 1][len][r];
        for(int len = 0; len < b; len++)
            for(int r = 0; r < k; r++){
                d[n][len + 1][(r * 10 + x) % k] += d[n - 1][len][r] - d[lastcif[x] - 1][len][r];
                d[n][len + 1][(r * 10 + x) % k] %= MOD;
            }
        lastcif[x] = n;
        c = fgetc(fi);
        //for(int len = 0; len <= b; len++)
        //    printf("%d ", d[n][len][0]);
        //printf("\n");
    }

    int ans = 0;
    for(int len = a; len <= b; len++){
        ans += d[n][len][0];
        ans %= MOD;
    }
    fprintf(fo,"%d", ans);

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