#include <stdio.h>
#include <string.h>
const long long oo = 1000000000000000000LL;
struct point
{
long long a, b;
}f[20][180][1100], ans;
long long l1, r1, l, i, j, r, k, ls, rs, ws[22], h;
void merge(point &x, point &y)
{
y.a = x.a + y.a;
y.b = x.b;
}
void find(int h1, int sum, int rem)
{
if (f[h1][sum][rem].a != -1) return;
f[h1][sum][rem].a = 0;
f[h1][sum][rem].b = rem;
if ((h1 == 0) || (h1 == 1))
{
if (sum + rem >= k)
{
f[h1][sum][rem].a = 1;
f[h1][sum][rem].b = 0;
} else
{
f[h1][sum][rem].a = 0;
f[h1][sum][rem].b = sum + rem;
}
return;
}
for (int i1 = 0; i1 <= 9; ++i1)
{
find(h1 - 1, sum + i1, f[h1][sum][rem].b);
merge(f[h1 - 1][sum + i1][f[h1][sum][rem].b], f[h1][sum][rem]);
}
}
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
memset(f, -1, sizeof(f));
for (ws[1] = 1, i = 2; i <= 20; ws[i] = ws[i - 1] * 10, ++i);
scanf("%I64d%I64d%I64d", &l, &r, &k);
if (r == oo) r--;
for (h = -1, i = 18, l1 = l, r1 = r; i >= 1; --i)
{
if ((h == -1) && ((l1 / ws[i]) != (r1 / ws[i]))) h = i;
ls += (l1 % ws[i + 1]) / ws[i], rs += (r1 % ws[i + 1]) / ws[i];
}
find(0, ls, 0);
ans = f[0][ls][0];
if (h == -1)
{
printf("%I64d\n", ans.a);
return 0;
}
for (i = 1; i < h; ++i)
{
ls -= (l % ws[i + 1]) / ws[i];
for (j = (l % ws[i + 1]) / ws[i] + 1; j <= 9; ++j)
{
find(i, ls + j, ans.b);
merge(f[i][ls + j][ans.b], ans);
}
}
ls -= (l % ws[h + 1]) / ws[h];
for (i = (l % ws[h + 1]) / ws[h] + 1; i <= (r % ws[h + 1]) / ws[h] - 1; ++i)
{
find(h, ls + i, ans.b);
merge(f[h][ls + i][ans.b], ans);
}
ls += (r % ws[h + 1]) / ws[h];
for (i = h - 1; i >= 1; --i)
{
for (j = 0; j <= (r % ws[i + 1]) / ws[i] - 1; ++j)
{
find(i, ls + j, ans.b);
merge(f[i][ls + j][ans.b], ans);
}
ls += (r % ws[i + 1]) / ws[i];
}
find(0, ls, ans.b);
merge(f[0][ls][ans.b], ans);
printf("%I64d", ans.a);
return 0;
}
#include <string.h>
const long long oo = 1000000000000000000LL;
struct point
{
long long a, b;
}f[20][180][1100], ans;
long long l1, r1, l, i, j, r, k, ls, rs, ws[22], h;
void merge(point &x, point &y)
{
y.a = x.a + y.a;
y.b = x.b;
}
void find(int h1, int sum, int rem)
{
if (f[h1][sum][rem].a != -1) return;
f[h1][sum][rem].a = 0;
f[h1][sum][rem].b = rem;
if ((h1 == 0) || (h1 == 1))
{
if (sum + rem >= k)
{
f[h1][sum][rem].a = 1;
f[h1][sum][rem].b = 0;
} else
{
f[h1][sum][rem].a = 0;
f[h1][sum][rem].b = sum + rem;
}
return;
}
for (int i1 = 0; i1 <= 9; ++i1)
{
find(h1 - 1, sum + i1, f[h1][sum][rem].b);
merge(f[h1 - 1][sum + i1][f[h1][sum][rem].b], f[h1][sum][rem]);
}
}
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
memset(f, -1, sizeof(f));
for (ws[1] = 1, i = 2; i <= 20; ws[i] = ws[i - 1] * 10, ++i);
scanf("%I64d%I64d%I64d", &l, &r, &k);
if (r == oo) r--;
for (h = -1, i = 18, l1 = l, r1 = r; i >= 1; --i)
{
if ((h == -1) && ((l1 / ws[i]) != (r1 / ws[i]))) h = i;
ls += (l1 % ws[i + 1]) / ws[i], rs += (r1 % ws[i + 1]) / ws[i];
}
find(0, ls, 0);
ans = f[0][ls][0];
if (h == -1)
{
printf("%I64d\n", ans.a);
return 0;
}
for (i = 1; i < h; ++i)
{
ls -= (l % ws[i + 1]) / ws[i];
for (j = (l % ws[i + 1]) / ws[i] + 1; j <= 9; ++j)
{
find(i, ls + j, ans.b);
merge(f[i][ls + j][ans.b], ans);
}
}
ls -= (l % ws[h + 1]) / ws[h];
for (i = (l % ws[h + 1]) / ws[h] + 1; i <= (r % ws[h + 1]) / ws[h] - 1; ++i)
{
find(h, ls + i, ans.b);
merge(f[h][ls + i][ans.b], ans);
}
ls += (r % ws[h + 1]) / ws[h];
for (i = h - 1; i >= 1; --i)
{
for (j = 0; j <= (r % ws[i + 1]) / ws[i] - 1; ++j)
{
find(i, ls + j, ans.b);
merge(f[i][ls + j][ans.b], ans);
}
ls += (r % ws[i + 1]) / ws[i];
}
find(0, ls, ans.b);
merge(f[0][ls][ans.b], ans);
printf("%I64d", ans.a);
return 0;
}