#include #include #include const int radix = 10; unsigned long long solve(int K, int D) { // předpočítané zbytky mocnin desítky int *powers = malloc(sizeof(int) * D); int remainder = 1; for (int i = 0; i < D; i++) { remainder = remainder % K; powers[i] = remainder; remainder = remainder * radix; } int baseCount = (D + 1) / 2; // předpočítané zbytky podpalindromů s nenulovými číslicemi rovnými 1 // zbytky ostatních podpalindromů se z těchto snadno dopočítají int *bases = malloc(sizeof(int) * baseCount); for (int i = 0; i < baseCount; i++) { int j = D - 1 - i; int base; if (i == j) base = powers[i]; else base = (powers[i] + powers[j]) % K; bases[i] = base; } // tabulka zbytků pro aktuální krok unsigned long long *newPalindromes = calloc(K, sizeof(unsigned long long)); remainder = bases[0]; for (int i = 1; i < radix; i++) { newPalindromes[remainder]++; remainder = (remainder + bases[0]) % K; } // tabulka zbytků pro předešlý krok unsigned long long *palindromes = malloc(sizeof(unsigned long long) * K); for (int i = 1; i < baseCount; i++) { for (int t = 0; t < K; t++) palindromes[t] = newPalindromes[t]; remainder = bases[i]; for (int j = 1; j < radix; j++) { for (int k = 0; k < K; k++) newPalindromes[(k + remainder) % K] += palindromes[k]; remainder = (remainder + bases[i]) % K; } } return newPalindromes[0]; } int main(void) { int K, D; FILE *in = fopen("vstup.in", "r"); fscanf(in, "%d %d", &K, &D); fclose(in); unsigned long long solution = solve(K, D); FILE *out = fopen("pocet.out", "w"); fprintf(out, "%llu", solution); fclose(out); }