#include const int Mod = 1000000007; long long pow[100001]; long long div_mod(long long x, long long y, long long z) { if (x % y == 0) return x / y; else return (div_mod((1 + x / y) * y - x, (z % y), y) * z + x) / y; } long long recursion(int l, char N[]) { if (l == 0 || N[0] == '0') return 0; else if (l == 1) return (N[0] - '0') * (N[0] - '0' + 1) / 2; else return (recursion(l - 1, &(N[1])) * (N[0] - '0') + pow[l-1] * (N[0] - '0') * (N[0] - '0' - 1) / 2) % Mod; } int main() { char N[100001]; scanf("%s", N); int i, l; for (i = 1, pow[0] = 1; i <= 100000; i++) pow[i] = pow[i-1] * 45 % Mod; for (l = 0; N[l] != 0; l++); printf("%lld\n", (recursion(l - 1, &(N[1])) * (N[0] - '0') + pow[l-1] * (N[0] - '0') * (N[0] - '0' - 1) / 2 + div_mod((pow[l] - pow[1] + Mod) % Mod, 44, Mod)) % Mod); fflush(stdout); return 0; }