public class Euler612 {
    static final long MOD = 1000267129L;
    static final int DIGS = 10;
    static final int FULL = (1 << DIGS) - 1;

    static long modPow(long a, long e) {
        long r = 1;
        a %= MOD;
        while (e > 0) {
            if ((e & 1) == 1)
                r = (r * a) % MOD;
            a = (a * a) % MOD;
            e >>= 1;
        }
        return r;
    }

    static long[] countByMask(int maxLen) {
        long[] cnt = new long[FULL + 1];
        long[] dp = new long[FULL + 1];
        long[] ndp = new long[FULL + 1];

        for (int d = 1; d <= 9; d++) {
            dp[1 << d]++;
        }

        for (int len = 1; len <= maxLen; len++) {
            for (int m = 0; m <= FULL; m++) {
                cnt[m] += dp[m];
                if (cnt[m] >= MOD)
                    cnt[m] -= MOD;
            }
            if (len == maxLen)
                break;

            for (int m = 0; m <= FULL; m++)
                ndp[m] = 0;
            for (int m = 0; m <= FULL; m++) {
                long v = dp[m];
                if (v == 0)
                    continue;
                for (int d = 0; d <= 9; d++) {
                    int nm = m | (1 << d);
                    ndp[nm] += v;
                    if (ndp[nm] >= MOD)
                        ndp[nm] -= MOD;
                }
            }
            long[] tmp = dp;
            dp = ndp;
            ndp = tmp;
        }
        return cnt;
    }

    static String solveF(int K) {
        long inv2 = (MOD + 1) / 2;
        long[] cnt = countByMask(K);

        long[] sumSub = new long[FULL + 1];
        System.arraycopy(cnt, 0, sumSub, 0, FULL + 1);

        for (int b = 0; b < DIGS; b++) {
            int bit = 1 << b;
            for (int mask = 0; mask <= FULL; mask++) {
                if ((mask & bit) != 0) {
                    sumSub[mask] += sumSub[mask ^ bit];
                    if (sumSub[mask] >= MOD)
                        sumSub[mask] -= MOD;
                }
            }
        }

        long orderedDisjoint = 0;
        for (int a = 0; a <= FULL; a++) {
            long term = (cnt[a] * sumSub[FULL ^ a]) % MOD;
            orderedDisjoint = (orderedDisjoint + term) % MOD;
        }
        long disjointPairs = (orderedDisjoint * inv2) % MOD;

        long M = (modPow(10, K) - 1 + MOD) % MOD;
        long totalPairs = (((M * (M - 1 + MOD) % MOD) % MOD) * inv2) % MOD;

        long result = (totalPairs - disjointPairs + MOD) % MOD;
        return Long.toString(result);
    }

    public static String solve() {
        return solveF(18);
    }

    public static void main(String[] args) {
        System.out.println(solve());
    }
}
