You are given two integers l and r (l ≤ r). Your task is to calculate the sum of numbers from l to r (including l and r) such that each number contains at most k different digits, and print this sum modulo 998244353.

For example, if k = 1 then you have to calculate all numbers from l to r such that each number is formed using only one digit. For l = 10, r = 50 the answer is 11 + 22 + 33 + 44 = 110.

Input

The only line of the input contains three integers l, r and k (1 ≤ l ≤ r < 10^{18}, 1 ≤ k ≤ 10) — the borders of the segment and the maximum number of different digits.

Output

Print one integer — the sum of numbers from l to r such that each number contains at most k different digits, modulo 998244353.

Examples

Input

10 50 2


Output

1230


Input

1 2345 10


Output

2750685


Input

101 154 2


Output

2189

Note

For the first example the answer is just the sum of numbers from l to r which equals to (50 ⋅ 51)/(2) - (9 ⋅ 10)/(2) = 1230. This example also explained in the problem statement but for k = 1.

For the second example the answer is just the sum of numbers from l to r which equals to (2345 ⋅ 2346)/(2) = 2750685.

For the third example the answer is 101 + 110 + 111 + 112 + 113 + 114 + 115 + 116 + 117 + 118 + 119 + 121 + 122 + 131 + 133 + 141 + 144 + 151 = 2189.
/*Author: Satyajeet Singh, Delhi Technological University*/
    import java.io.*;
    import java.util.*;
    import java.text.*; 
    import java.lang.*;
    import java.math.*;
 
public class Main{
/*********************************************Constants******************************************/
    static PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));        
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static long mod=(long)1e9+7;
    static long mod1=998244353;
    static boolean sieve[];
    static ArrayList<Integer> primes;
    static long factorial[],invFactorial[];
    static HashSet<Pair> graph[];
    static boolean oj = System.getProperty("ONLINE_JUDGE") != null;
/****************************************Solutions Begins***************************************/
    static ArrayList<Long> list;
    static long dp[][][][],tenpow[],fans=0;
    static int sz=0,k;
    static long dfs(int i,int f,int nz,int mask){
        int nm=0;
       // debug(i,f,nz,mask);
        for(int u=0;u<10;u++){
            if((mask&(1<<u))!=0){
                nm++;
            }
        }
        if(nm>k){
            return 0;
        }
        if(i==sz){
           // debug("hi");
            return 1;
        }
        if(dp[i][f][nz][mask]!=-1){
            return dp[i][f][nz][mask];
        }
        long ans=0;
        for(int j=0;j<=9;j++){
            long cur=0;
            if(j<list.get(i)||f==0){
                if(nz==1||j!=0){
                    cur=dfs(i+1,0,1,(mask|(1<<j)));
                }
                else{
                    cur=dfs(i+1,0,0,0);
                }
            }
            else if(j==list.get(i)){
                if(nz==1||j!=0){
                    cur=dfs(i+1,1,1,(mask|(1<<j)));
                }
                else{
                    cur=dfs(i+1,1,0,0);
                }
            }
            ans=(ans+cur)%mod1;
        }
        dp[i][f][nz][mask]=ans;
        return dp[i][f][nz][mask];
    }
    static long dp1[][][][];

    static long dfs1(int i,int f,int nz,int mask){
       // debug(i,mask);

        int nm=0;
        for(int u=0;u<10;u++){
            if((mask&(1<<u))!=0){
                nm++;
            }
        }
        if(nm>k){
            return 0;
        }
        if(i==sz){
            return 0;
        }
        if(dp1[i][f][nz][mask]!=-1){
            return dp1[i][f][nz][mask];
        }
        long ans=0;
        for(int j=0;j<=9;j++){
            long cur=0;
            long cnt=0;
            if(j<list.get(i)||f==0){
                if(nz==1||j!=0){
                    cur=dfs1(i+1,0,1,(mask|(1<<j)));
                    cnt=dfs(i+1,0,1,(mask|(1<<j)));
                }
                else{
                    cur=dfs1(i+1,0,0,0);
                    cnt=dfs(i+1,0,0,0);
                }
            }
            else if(j==list.get(i)){
                if(nz==1||j!=0){
                    cur=dfs1(i+1,1,1,(mask|(1<<j)));
                    cnt=dfs(i+1,1,1,(mask|(1<<j)));
                }
                else{
                    cur=dfs1(i+1,1,0,0);
                    cnt=dfs(i+1,1,0,0);
                }
            }
            long kk=(j*cnt)%mod1;
            kk=(kk*tenpow[sz-i-1])%mod1;
            ans=(ans+cur)%mod1;
            ans=(ans+kk)%mod1;
        }
        dp1[i][f][nz][mask]=ans;
        return dp1[i][f][nz][mask];
    }

    static long fn(long a){
        list=new ArrayList<>();
        while(a!=0){
            list.add(a%10);
            a/=10;
        }
        Collections.reverse(list);
        sz=list.size();
        //debug(list);
        //debug(sz);

        dp=new long[sz+1][2][2][1<<10];
        for(long arr[][][]:dp)
            for(long ar[][]:arr)
                for(long aa[]:ar)
                    Arrays.fill(aa,-1);
        dp1=new long[sz+1][2][2][1<<10];
        for(long arr[][][]:dp1)
            for(long ar[][]:arr)
                for(long aa[]:ar)
                    Arrays.fill(aa,-1);
                    //debug(k);
      //  debug(dfs(1,1,1,2));
        //dfs(0,1,0,0);
        //debug(dp[1][1][1][2]);
         long ans=dfs1(0,1,0,0);
       // long ans=0;
        return ans;
    }
    public static void main (String[] args) throws Exception {
        String st[]=nl();
        long l=pl(st[0]);
        long r=pl(st[1]);
        k=pi(st[2]);
        tenpow=new long[20];
        tenpow[0]=1;
        for(int i=1;i<tenpow.length;i++){
            tenpow[i]=(tenpow[i-1]*10)%mod1;
        }
       // debug(tenpow);
        
        long ans=(fn(r)-fn(l-1)+mod1)%mod1;
        out.println(ans);
/****************************************Solutions Ends**************************************************/
        out.flush();
        out.close();
    }
/****************************************Template Begins************************************************/
    static String[] nl() throws Exception{
        return br.readLine().split(" ");
    }
    static String[] nls() throws Exception{
        return br.readLine().split("");
    }
    static int pi(String str) {
        return Integer.parseInt(str);
    }
    static long pl(String str){
        return Long.parseLong(str);
    }
    static double pd(String str){
        return Double.parseDouble(str);
    }
/***************************************Precision Printing**********************************************/
    static void printPrecision(double d){
        DecimalFormat ft = new DecimalFormat("0.00000000000000000"); 
        out.println(ft.format(d));
    }
/**************************************Bit Manipulation**************************************************/
    static void printMask(long mask){
        System.out.println(Long.toBinaryString(mask));
    }
    static int countBit(int mask){
        int ans=0;
        while(mask!=0){
            if(mask%2==1){
                ans++;
            }
            mask/=2;
        }
        return ans;
    }
/******************************************Graph*********************************************************/
    static void Makegraph(int n){
        graph=new HashSet[n];
        for(int i=0;i<n;i++){
            graph[i]=new HashSet<>();
        }
    }
    static void addEdge(int a,int b){
        graph[a].add(new Pair(b,1));
    }
    static void addEdge(int a,int b,int c){
        graph[a].add(new Pair(b,c));
    }    
/*********************************************PAIR********************************************************/
    static class PairComp implements Comparator<Pair>{
        public int compare(Pair p1,Pair p2){
            return ((p1.u+p1.v)-(p2.u+p2.v));
        }
    }
    static class Pair implements Comparable<Pair> {
        int u;
        int v;
        int index=-1;
        public Pair(int u, int v) {
            this.u = u;
            this.v = v;
        }
        public int hashCode() {
            int hu = (int) (u ^ (u >>> 32));
            int hv = (int) (v ^ (v >>> 32));
            return 31 * hu + hv;
        }
        public boolean equals(Object o) {
            Pair other = (Pair) o;
            return u == other.u && v == other.v;
        }
        public int compareTo(Pair other) {
            if(index!=other.index)
                return Long.compare(index, other.index);
            return Long.compare(v, other.v)!=0?Long.compare(v, other.v):Long.compare(u, other.u);
        }
        public String toString() {
            return "[u=" + u + ", v=" + v + "]";
        }
    }
/******************************************Long Pair*************************************************/
    static class PairCompL implements Comparator<Pairl>{
        public int compare(Pairl p1,Pairl p2){
            if((p1.u+2*p1.v)-(p2.u+2*p2.v)<0){
                return -1;
            }
            else if((p1.u+2*p1.v)-(p2.u+2*p2.v)>0){
                return 1;
            }
            else{
                return 0;
            }
        }
    }
    static class Pairl implements Comparable<Pairl> {
            long u;
            long v;
            int index=-1;
            public Pairl(long u, long v) {
                this.u = u;
                this.v = v;
            }
    
            public int hashCode() {
                int hu = (int) (u ^ (u >>> 32));
                int hv = (int) (v ^ (v >>> 32));
                return 31 * hu + hv;
            }
    
            public boolean equals(Object o) {
                Pair other = (Pair) o;
                return u == other.u && v == other.v;
            }
    
            public int compareTo(Pairl other) {
                if(index!=other.index)
                    return Long.compare(index, other.index);
                return Long.compare(v, other.v)!=0?Long.compare(v, other.v):Long.compare(u, other.u);
            }
    
            public String toString() {
                return "[u=" + u + ", v=" + v + "]";
            }
        }
/*****************************************DEBUG***********************************************************/
    public static void debug(Object... o) {
        if(!oj)
        System.out.println(Arrays.deepToString(o));
    }
/************************************MODULAR EXPONENTIATION***********************************************/
    static long modulo(long a,long b,long c) {
        long x=1;
        long y=a;
        while(b > 0){
            if(b%2 == 1){
                x=(x*y)%c;
            }
            y = (y*y)%c; // squaring the base
            b /= 2;
        }
        return  x%c;
    }
/********************************************GCD**********************************************************/
    static long gcd(long x, long y)
    {
        if(x==0)
            return y;
        if(y==0)
            return x;
        long r=0, a, b;
        a = (x > y) ? x : y; // a is greater number
        b = (x < y) ? x : y; // b is smaller number
        r = b;
        while(a % b != 0)
        {
            r = a % b;
            a = b;
            b = r;
        }
        return r;
    }
/******************************************SIEVE**********************************************************/
    static void sieveMake(int n){
        sieve=new boolean[n];
        Arrays.fill(sieve,true);
        sieve[0]=false;
        sieve[1]=false;
        for(int i=2;i*i<n;i++){
            if(sieve[i]){
                for(int j=i*i;j<n;j+=i){
                    sieve[j]=false;
                }
            }
        }
        primes=new ArrayList<Integer>();
        for(int i=0;i<n;i++){
            if(sieve[i]){
                primes.add(i);
            }
        }        
    }
/********************************************End***********************************************************/
}