#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 1e5 + 10;
const int mod = 998244353;
int ans[maxn];
int cnt[10];
int vaild;
int a[100];
inline int add(int i)
{
cnt[i]++;
if (cnt[i] == 1)return 1;
return 0;
}
inline int del(int i)
{
cnt[i]--;
if (cnt[i] == 0)return -1;
return 0;
}
int k;
struct node
{
int tim, sum;
bool operator==(node a)
{
return tim == a.tim&&sum == a.sum;
}
};
node dp[64][1025][20][2][2];
int P[20];
long long qpow(long long a, long long b)
{
/*if (b == 0)
return 1;
if (b == 1)
return a;
long long tmp = qpow(a, b / 2);
tmp *= tmp;
tmp %= mod;
if (b % 2 != 0)
tmp *= a;
return tmp%mod;*/
return P[b];
}
node dfs(int num, int now,int last,int info, int top, int p0)
{
if (last > k)return{0,0};
if (num == 0)
{
if (p0) return{ 0, 0 };
else return{ last<=k?1:0, now};
}
if (dp[num][info][last][top][p0].sum != -1)
return dp[num][info][last][top][p0];
int bound = top ? a[num] : 9;
node res = { 0, 0 };
for (int i = 0; i <= bound; i++)
{
if (p0&&i == 0)
{
node tmp = dfs(num - 1,i,last,info, top && (bound == i), p0);
res.sum += tmp.sum;
res.tim += tmp.tim;
}
else
{
last+=add(i);
if (last > k)
{
last += del(i);
continue;
}
node tmp = dfs(num - 1,i,last,info|(1<<i), top && (bound == i), 0);
res.sum += (((qpow(10, num)*now%mod)*(tmp.tim%mod) + tmp.sum%mod) % mod+mod)%mod;//(((int)pow(10, num) % mod*now%mod*tmp.tim%mod + tmp.sum) % mod + mod) % mod;
res.tim += tmp.tim;
res.sum %= mod;
res.tim %= mod;
last += del(i);
}
}
if (dp[num][info][last][top][p0].tim != -1)
dp[num][info][last][top][p0] = res;
return res;
}
int solve(unsigned long long l)
{
int len = 0;
while (l)
{
a[++len] = l % 10;
l /= 10;
}
return (dfs(len, 0,0,0,1, 1).sum%mod+mod)%mod;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
memset(dp, -1, sizeof(dp));
int t = 1;
P[1] = 10;
for (int i = 2; i <= 18; i++)
P[i] = 10 * P[i - 1] % mod;
while (t--)
{
unsigned long long l, r;
cin >> l >> r>>k;
cout << ((solve(r)-solve(l-1))%mod+mod)%mod<<'\n';
}
return 0;
}