public class Euler217 {
    static final long MOD = 14348907L; // 3^15

    public static void main(String[] args) {
        int n = 47;
        int maxHalf = (n + 1) / 2;
        long[][] cntL = new long[maxHalf + 1][], sumL = new long[maxHalf + 1][];
        long[][] cntR = new long[maxHalf + 1][], sumR = new long[maxHalf + 1][];
        buildDP(cntL, sumL, maxHalf, true);
        buildDP(cntR, sumR, maxHalf, false);
        long[] pow10 = new long[n + 2];
        pow10[0] = 1 % MOD;
        for (int i = 1; i <= n + 1; i++)
            pow10[i] = pow10[i - 1] * 10 % MOD;
        long total = 0;
        for (int len = 1; len <= n; len++) {
            int half = len / 2;
            boolean odd = len % 2 == 1;
            int ms = 9 * half;
            if (!odd) {
                long shift = pow10[half];
                for (int s = 0; s <= ms; s++) {
                    if (cntL[half][s] == 0 || cntR[half][s] == 0)
                        continue;
                    long pl = sumL[half][s] * shift % MOD * cntR[half][s] % MOD;
                    long pr = sumR[half][s] * cntL[half][s] % MOD;
                    total = (total + pl + pr) % MOD;
                }
            } else {
                long shiftL = pow10[half + 1], shiftM = pow10[half];
                for (int s = 0; s <= ms; s++) {
                    if (cntL[half][s] == 0 || cntR[half][s] == 0)
                        continue;
                    long pl = sumL[half][s] * shiftL % MOD * (cntR[half][s] * 10 % MOD) % MOD;
                    long pm = 45L * shiftM % MOD * (cntL[half][s] * cntR[half][s] % MOD) % MOD;
                    long pr = sumR[half][s] * cntL[half][s] % MOD * 10 % MOD;
                    total = (total + pl + pm + pr) % MOD;
                }
            }
        }
        System.out.println(total);
    }

    static void buildDP(long[][] count, long[][] sum, int maxLen, boolean leadNonzero) {
        for (int l = 0; l <= maxLen; l++) {
            count[l] = new long[9 * maxLen + 1];
            sum[l] = new long[9 * maxLen + 1];
        }
        count[0][0] = 1;
        for (int l = 0; l < maxLen; l++) {
            for (int s = 0; s <= 9 * l; s++) {
                long c = count[l][s], sv = sum[l][s];
                if (c == 0 && sv == 0)
                    continue;
                int d0 = (leadNonzero && l == 0) ? 1 : 0;
                for (int d = d0; d <= 9; d++) {
                    int ns = s + d;
                    count[l + 1][ns] = (count[l + 1][ns] + c) % MOD;
                    long val = (sv * 10 + d * c) % MOD;
                    sum[l + 1][ns] = (sum[l + 1][ns] + val) % MOD;
                }
            }
        }
    }
}
