Language: C++

#include <bits/stdc++.h>
using namespace std;

#define d(x) cerr << #x ":" << x << endl;
#define dd(x, y) cerr << "(" #x "," #y "):(" << x << "," << y << ")" << endl
#define rep(i, n) for (int i = (int)(0); i < (int)(n); i++)
#define repp(i, a, b) for (int i = (int)(a); i < (int)(b); i++)
#define all(v) v.begin(), v.end()
#define dump(v)                  \
    cerr << #v ":[ ";            \
    for (auto macro_vi : v) {    \
        cerr << macro_vi << " "; \
    }                            \
    cerr << "]" << endl;
#define ddump(v)                           \
    cerr << #v ":" << endl;                \
    for (auto macro_row : v) {             \
        cerr << "[";                       \
        for (auto macro__vi : macro_row) { \
            cerr << macro__vi << " ";      \
        }                                  \
        cerr << "]" << endl;               \
    }
using lint       = long long;
const int INF    = 1e9;
const lint LINF  = 1e18;
const lint MOD   = 1e9 + 7;
const double EPS = 1e-10;
const int mod    = 1e18 + 7;
struct mint {
    long long x;
    mint(long long x = 0) : x((x % mod + mod) % mod) {}
    mint& operator+=(const mint a) {
        if ((x += a.x) >= mod) x -= mod;
        return *this;
    }
    mint& operator-=(const mint a) {
        if ((x += mod - a.x) >= mod) x -= mod;
        return *this;
    }
    mint& operator*=(const mint a) {
        (x *= a.x) %= mod;
        return *this;
    }
    mint operator+(const mint a) const {
        mint res(*this);
        return res += a;
    }
    mint operator-(const mint a) const {
        mint res(*this);
        return res -= a;
    }
    mint operator*(const mint a) const {
        mint res(*this);
        return res *= a;
    }
    mint pow(long long t) const {
        if (!t) return 1;
        mint a = pow(t >> 1);
        a *= a;
        if (t & 1) a *= *this;
        return a;
    }

    // for prime mod
    mint inv() const { return pow(mod - 2); }
    mint& operator/=(const mint a) { return (*this) *= a.inv(); }
    mint operator/(const mint a) const {
        mint res(*this);
        return res /= a;
    }
};
struct combination {
    vector<mint> fact, ifact;
    combination(int n) : fact(n + 1), ifact(n + 1) {
        assert(n < mod);
        fact[0] = 1;
        for (int i = 1; i <= n; ++i)
            fact[i] = fact[i - 1] * i;
        ifact[n] = fact[n].inv();
        for (int i = n; i >= 1; --i)
            ifact[i - 1] = ifact[i] * i;
    }
    mint operator()(int n, int k) {
        if (k < 0 || k > n) return 0;
        return fact[n] * ifact[k] * ifact[n - k];
    }
    mint operator()(int n) { return fact[n]; }
};
int main() {
    string N;
    int k;
    cin >> N >> k;
    combination comb(1000000);
    int D = N.size();
    if (k == 1) {
        lint ans = 0;
        for (int d = 1; d < D; d++) {
            ans += 9;
        }
        d(ans);
        int x = N[0] - '0';
        d(x);
        ans += x * (x + 1) / 2;
        cout << ans << endl;
    } else if (k == 2) {
        lint ans = 0;
        for (int d = 2; d < D; d++) {
            ans += 9 * 9 * comb(D - 1, 1).x;
        }
        int M1 = N[0] - '0';
        for (int x = 1; x < M1; x++) {
            ans += x * 9 * comb(D - 1, 1).x;
        }

        int idx = -1;
        for (int i = 2; i <= D; i++) {
            if (N[i] != '0') {
                idx = i;
                break;
            }
        }

        if (idx == -1) {

        } else {
            int M2 = N[idx - 1] - '0';
            for (int i = 1; i <= M2; i++) {
                ans += 1;
            }
            ans += 9 * comb(D - idx, 1).x;
        }
    } else {
        continue;
    }
    return 0;
}

Compiler output:
a.cc:29:25: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   29 | const int mod    = 1e18 + 7;
      |                    ~~~~~^~~
a.cc: In function 'int main()':
a.cc:134:9: error: continue statement not within a loop
  134 |         continue;
      |         ^~~~~~~~