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.
import java.io.*;
import java.util.*;

public class Task {

    public static void main(String[] args) throws Exception {

        new Task().go();
    }

    PrintWriter out;
    Reader in;
    BufferedReader br;

    Task() throws IOException {

        try {

            //br = new BufferedReader( new FileReader("input.txt") );
            //in = new Reader("input.txt");
            in = new Reader("input.txt");
            out = new PrintWriter( new BufferedWriter(new FileWriter("output.txt")) );
        }
        catch (Exception e) {

            //br = new BufferedReader( new InputStreamReader( System.in ) );
            in = new Reader();
            out = new PrintWriter( new BufferedWriter(new OutputStreamWriter(System.out)) );
        }
    }

    void go() throws Exception {

        //int t = in.nextInt();
        int t = 1;
        while (t > 0) {
            solve();
            t--;
        }

        out.flush();
        out.close();
    }


    int inf = 2000000000;
    int mod = 1000000007;
    double eps = 0.000000001;

    int n;
    int m;

    void solve() throws IOException {
        long l = in.nextLong();
        long r = in.nextLong();
        int k = in.nextInt();
        long res = ((calc(r, k) - calc(l - 1, k)) % MOD + MOD) % MOD;
        out.println(res);
    }

    int MOD = 998244353;

    long calc(long r, int k) {

        if (r == 0)
            return 0;

        long ans = 0;
        String s = r+"";
        int len = s.length();
        long[][] dp = new long[len+1][1 << 10];
        long[][] dp2 = new long[len+1][1 << 10];
        boolean[][] used = new boolean[len+1][1 << 10];
        boolean[][] used2 = new boolean[len+1][1 << 10];
        long[][] cnt = new long[len+1][1 << 10];
        long[][] cnt2 = new long[len+1][1 << 10];

        dp[0][0] = 0;
        dp2[0][0] = 0;
        used[0][0] = true;
        used2[0][0] = true;
        cnt[0][0] = 1;
        cnt2[0][0] = 1;

        long dec = 1;

        for (int i = 1; i <= len; i++) {
            int ch = s.charAt(len - i) - '0';
            for (int m = 0; m < 1 << 10; m++) {
                for (int j = 0; j < 10; j++) {

                    int mask = m | (1 << j);
                    long mdec = dec % MOD;

                    if (used[i - 1][m]) {
                        long c = (((j * mdec) % MOD) * cnt[i - 1][m]) % MOD;
                        dp[i][mask] += dp[i - 1][m] + c;
                        dp[i][mask] %= MOD;
                        cnt[i][mask] += cnt[i - 1][m];
                        cnt[i][mask] %= MOD;
                        used[i][mask] = true;

                        if (j > 0 && Integer.bitCount(mask) <= k) {
                            if (i < len || j < ch) {
                                ans = (ans + dp[i - 1][m] + c) % MOD;
                            }
                        }
                    }

                    if (Integer.bitCount(mask) <= k) {
                        if (j < ch && used[i - 1][m]) {
                            long c = (((j * mdec) % MOD) * cnt[i - 1][m]) % MOD;
                            dp2[i][mask] = (dp2[i][mask] + dp[i - 1][m] + c) % MOD;
                            used2[i][mask] = true;
                            cnt2[i][mask] += cnt[i - 1][m];
                            cnt2[i][mask] %= MOD;
                        }
                        else if (j == ch && used2[i - 1][m]) {
                            long c = (((j * mdec) % MOD) * cnt2[i - 1][m]) % MOD;
                            dp2[i][mask] = (dp2[i][mask] + dp2[i - 1][m] + c) % MOD;
                            used2[i][mask] = true;
                            cnt2[i][mask] += cnt2[i - 1][m];
                            cnt2[i][mask] %= MOD;
                        }
                    }
                }
            }
            dec *= 10;
        }

        long sum = 0;
        dec = dec / 10 % MOD;
        int d = s.charAt(0) - '0';
        int c = 0;
        for (int m = 0; m < 1 << 10; m++)
            if (Integer.bitCount(m | (1 << d)) <= k && used2[len - 1][m]) {
            long cnts = ((d * dec) % MOD * cnt2[len - 1][m]) % MOD;
            sum += (dp2[len - 1][m] + cnts) % MOD;
            c += cnt2[len - 1][m];
        }

        //System.err.println(c);
        System.err.println(ans+" "+sum);

        return ans + sum;
    }


    class Pair implements Comparable<Pair>{

        int a;
        int b;

        Pair(int a, int b) {

            this.a = a;
            this.b = b;
        }

        public int compareTo(Pair p) {
            if (a > p.a) return -1;
            if (a < p.a) return 1;
            if (b > p.b) return -1;
            if (b < p.b) return 1;
            return 0;
        }
    }

    class Item {

        int a;
        int b;
        int c;

        Item(int a, int b, int c) {
            this.a = a;
            this.b = b;
            this.c = c;
        }

    }


    class Reader {

        BufferedReader  br;
        StringTokenizer tok;

        Reader(String file) throws IOException {
            br = new BufferedReader( new FileReader(file) );
        }

        Reader() throws IOException {
            br = new BufferedReader( new InputStreamReader(System.in) );
        }

        String next() throws IOException {

            while (tok == null || !tok.hasMoreElements())
                tok = new StringTokenizer(br.readLine());
            return tok.nextToken();
        }

        int nextInt() throws NumberFormatException, IOException {
            return Integer.valueOf(next());
        }

        long nextLong() throws NumberFormatException, IOException {
            return Long.valueOf(next());
        }

        double nextDouble() throws NumberFormatException, IOException {
            return Double.valueOf(next());
        }


        String nextLine() throws IOException {
            return br.readLine();
        }

    }

    static class InputReader
    {
        final private int BUFFER_SIZE = 1 << 16;
        private DataInputStream din;
        private byte[] buffer;
        private int bufferPointer, bytesRead;

        public InputReader()
        {
            din = new DataInputStream(System.in);
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        public InputReader(String file_name) throws IOException
        {
            din = new DataInputStream(new FileInputStream(file_name));
            buffer = new byte[BUFFER_SIZE];
            bufferPointer = bytesRead = 0;
        }

        public String readLine() throws IOException
        {
            byte[] buf = new byte[64]; // line length
            int cnt = 0, c;
            while ((c = read()) != -1)
            {
                if (c == '\n')
                    break;
                buf[cnt++] = (byte) c;
            }
            return new String(buf, 0, cnt);
        }

        public int nextInt() throws IOException
        {
            int ret = 0;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();
            do
            {
                ret = ret * 10 + c - '0';
            }  while ((c = read()) >= '0' && c <= '9');

            if (neg)
                return -ret;
            return ret;
        }

        public long nextLong() throws IOException
        {
            long ret = 0;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();
            do {
                ret = ret * 10 + c - '0';
            }
            while ((c = read()) >= '0' && c <= '9');
            if (neg)
                return -ret;
            return ret;
        }

        public double nextDouble() throws IOException
        {
            double ret = 0, div = 1;
            byte c = read();
            while (c <= ' ')
                c = read();
            boolean neg = (c == '-');
            if (neg)
                c = read();

            do {
                ret = ret * 10 + c - '0';
            }
            while ((c = read()) >= '0' && c <= '9');

            if (c == '.')
            {
                while ((c = read()) >= '0' && c <= '9')
                {
                    ret += (c - '0') / (div *= 10);
                }
            }

            if (neg)
                return -ret;
            return ret;
        }

        private void fillBuffer() throws IOException
        {
            bytesRead = din.read(buffer, bufferPointer = 0, BUFFER_SIZE);
            if (bytesRead == -1)
                buffer[0] = -1;
        }

        private byte read() throws IOException
        {
            if (bufferPointer == bytesRead)
                fillBuffer();
            return buffer[bufferPointer++];
        }

        public void close() throws IOException
        {
            if (din == null)
                return;
            din.close();
        }
    }

} 