Cod sursa(job #1770000)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 3 octombrie 2016 17:12:01
Problema Diviz Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <iostream>
#include <cstdio>
#define MAXN 220
#define MAXK 110
#define MOD 30103

using namespace std;

int mod(int &e)
{
	if (e >= MOD) e-= MOD;
}
int k, a, b;
char s[MAXN];
int sir[MAXN], n;
int din[2][MAXN][MAXK], u[MAXN][15];

void read()
{
	scanf("%d %d %d\n", &k, &a, &b);
    gets(s);
    for (int i = 0; s[i]; i++)
		sir[i+1] = s[i] - '0', n = i+1;
    for (int i = n; i >= 1; i--)
        for (int j = 0; j < 10; j++)
            u[i][j] = (sir[i] == j ? i : u[i+1][j]);
}

void solve()
{
	for (int i = 1; i <= n; i++)
        if (sir[i] != 0 && u[1][sir[i]] == i)
			din[0][i][sir[i] % k] = 1;
	int rez = 0, crt = 1;
    for (int i = 1; i <= b; i++) {
		for (int j = 1; j <= n; j++)
			for (int r = 0; r < k; r++)
				din[crt][j][r] = 0;
		crt ^= 1;
        for (int j = 1; j <= n; j++) {
			for (int r = 0; r < k; r++)
				if (din[crt][j][r])
					for (int c = 0; c < 10; c++)
						mod(din[!crt][u[j+1][c]][(10*r + c) % k] += din[crt][j][r]);
			if (i >= a)
				mod(rez += din[crt][j][0]);
        }
    }
	printf("%d", rez);
}

int main()
{
	freopen("diviz.in", "r", stdin);
	freopen("diviz.out", "w", stdout);

	read();
	solve();

    return 0;
}