Cod sursa(job #2093460)

Utilizator circeanubogdanCirceanu Bogdan circeanubogdan Data 23 decembrie 2017 18:41:44
Problema Diviz Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <cstring>
#define MOD 30103

using namespace std;

ifstream f("diviz.in");
ofstream g("diviz.out");

int mod, a, b, n, s;
int dp[2][205][102], next[12][205], last[12];
char sir[205];

void reset(int t){
    for(int i = 1; i <= n; ++ i)
        for(int k = 0; k < mod; ++ k)
            dp[t][i][k] = 0;
}

int main()
{
    f>>mod>>a>>b;
    f>>sir + 1;
    n = strlen(sir + 1);
    for(int i = 1; i <= n; ++ i)
        sir[i] -= '0';
    for(int i = n; i >= 1; -- i){
        last[sir[i]] = i;
        for(int j = 0; j <= 9; ++ j)
            next[j][i] = last[j];
    }

    for(int i = 1; i <= 9; ++ i)
        dp[1][next[i][1]][i % mod] = 1;

    int t = 1;
    for(int j = 1; j <= b; ++ j){
        for(int i = 1; i <= n; ++ i){
            for(int k = 0; k < mod; ++ k){
                if(dp[t][i][k])
                for(int cif = 0; cif <= 9; ++ cif){
                    dp[1 - t][next[cif][i + 1]][(k * 10 + cif) % mod] += dp[t][i][k];
                    dp[1 - t][next[cif][i + 1]][(k * 10 + cif) % mod] %= MOD;
                }
            }
            if(j >= a && j <= b)
                s = (s + dp[t][i][0]) % MOD;
        }
        reset(t);
        t = 1 - t;
    }
    g<<s;
    return 0;
}