// C# program to count of integers
// from the range [0, N] whose digit
// sum is a multiple of k
using System;
class GfG {
static int countRecur(int i, int sum, int tight,
string num, int k, int[,,] memo) {
if (i == num.Length) {
return sum == 0 ? 1 : 0;
}
// If value is memoized, return it.
if (memo[i, sum, tight] != -1) {
return memo[i, sum, tight];
}
int digit = num[i] - '0';
int ans = 0;
// Determine upper limit
int limit = tight == 1 ? digit : 9;
for (int j = 0; j <= limit; j++) {
ans += countRecur(i + 1, (sum + j) % k,
tight == 1 && j == digit ? 1 : 0, num, k, memo);
}
memo[i, sum, tight] = ans;
return ans;
}
static int count(int n, int k) {
string num = n.ToString();
int[,,] memo = new int[num.Length, k, 2];
for (int i = 0; i < num.Length; i++) {
for (int j = 0; j < k; j++) {
for (int l = 0; l < 2; l++) {
memo[i, j, l] = -1;
}
}
}
return countRecur(0, 0, 1, num, k, memo);
}
static void Main(string[] args) {
int n = 10, k = 5;
Console.WriteLine(count(n, k));
}
}