Cod sursa(job #2413239)

Utilizator lucametehauDart Monkey lucametehau Data 23 aprilie 2019 10:08:50
Problema Diviz Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream cin ("diviz.in");
ofstream cout ("diviz.out");

const int MOD = 30103;

int n, k, a, b, sol;

char s[205];
int dp[205][205][205], f[205][15];

int nr(char c) {
  return c - '0';
}

int main() {
  cin >> k >> a >> b >> (s + 1);
  n = strlen(s + 1);
  for(int i = n; i >= 1; i--) {
    for(int j = 0; j <= 9; j++)
      f[i][j] = f[i + 1][j];
    f[i][nr(s[i])] = i;
  }
  for(int i = 1; i <= 9; i++)
    dp[1][f[1][i]][i % k] = 1;
  for(int i = 1, ln = 1; i <= b; i++, ln = 1 - ln) {
    for(int j = i; j <= n; j++) {
      for(int r = 0; r < k; r++) {
        if(dp[ln][j][r] == 0)
          continue;
        for(int c = 0; c <= 9; c++) {
          if(f[j + 1][c]) {
            int r2 = (r * 10 + c) % k;
            dp[1 - ln][f[j + 1][c]][r2] += dp[ln][j][r];
            dp[1 - ln][f[j + 1][c]][r2] %= MOD;
          }
        }
      }
      if(i >= a) {
        sol += dp[ln][j][0];
        sol %= MOD;
      }
    }
    memset(dp[ln], 0, sizeof(dp[ln]));
  }
  cout << sol;
  return 0;
}