Problem p02792 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <bitset>    // bitset
#include <cctype>    // isupper, islower, isdigit, toupper, tolower
#include <cmath>
#include <cstdint>  // int64_t, int*_t
#include <cstdio>   // printf
#include <deque>    // deque
#include <iostream> // cout, endl, cin
#include <limits>
#include <map>           // map
#include <queue>         // queue, priority_queue
#include <set>           // set
#include <stack>         // stack
#include <string>        // string, to_string, stoi
#include <tuple>         // tuple, make_tuple
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <utility>       // pair, make_pair
#include <vector>        // vector
#define ll long long
#define ALL(x) (x).begin(), (x).end()
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define int_INF 2147483647
#define pint_INF 2000000000
#define ll_INF 9223372036854775807
#define MOD 100000007
#define vi vector<int>
#define vvi vector<vector<int>>
#define vll vector<long long>
#define pii pair<int, int>
#define vpii vector<pair<int, int>>
using namespace std;

ll M = MOD;
ll mpow(ll x,
        ll n) { // x^n(mod M) ←普通にpow(x,n)では溢れてしまうため，随時mod計算
  ll ans = 1;
  while (n != 0) {
    if (n & 1)
      ans = ans * x % M;
    x = x * x % M;
    n = n >> 1;
  }
  return ans;
}

int main() {
  int N;
  cin >> N;
  ll cnt = 0;
  for (int i = 1; i <= N; i++) {
    string s = to_string(i);
    string t = "";

    if (i % 10 == 0) {
      // cout << i << " " << cnt << endl;
      continue;
    }
    t.push_back(s[s.size() - 1]);
    t.push_back(s[0]);
    if (s[0] == s[s.size() - 1]) {
      cnt++;
    }

    while (t.size() < to_string(N).size()) {
      cnt += mpow(10, t.size() - 2);
      t.insert(1, "0");
    }
    // tの桁数 == Nの桁数

    if (stoi(t) > N) {
      // cout <<  i<< " " << cnt << endl;
      continue;
    }
    // このとき t <= N
    // 先頭の桁で場合分け
    if (t[0] < to_string(N)[0]) {
      cnt += mpow(10, t.size() - 2);
    } else { // 先頭の値が同じ
      if (t[t.size() - 1] <= to_string(N)[to_string(N).size() - 1]) {
        // tの末尾がNの末尾未満->10のpowerでよい
        //  t = 1003 N = 1xx4,11xx3
        ll temp = stoi(to_string(N).substr(1, to_string(N).size() - 2));
        cnt += temp + 1;
      } else {
        // t = 1003 N = 1xx2
        ll temp = stoi(to_string(N).substr(1, to_string(N).size() - 2));
        cnt += temp;
      }
    }

    // cout << i << " " << cnt << endl;
  }

  cout << cnt << endl;
}


Fixed submission:
#include <algorithm> // min, max, swap, sort, reverse, lower_bound, upper_bound
#include <bitset>    // bitset
#include <cctype>    // isupper, islower, isdigit, toupper, tolower
#include <cmath>
#include <cstdint>  // int64_t, int*_t
#include <cstdio>   // printf
#include <deque>    // deque
#include <iostream> // cout, endl, cin
#include <limits>
#include <map>           // map
#include <queue>         // queue, priority_queue
#include <set>           // set
#include <stack>         // stack
#include <string>        // string, to_string, stoi
#include <tuple>         // tuple, make_tuple
#include <unordered_map> // unordered_map
#include <unordered_set> // unordered_set
#include <utility>       // pair, make_pair
#include <vector>        // vector
#define ll long long
#define ALL(x) (x).begin(), (x).end()
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define int_INF 2147483647
#define pint_INF 2000000000
#define ll_INF 9223372036854775807
#define MOD 100000007
#define vi vector<int>
#define vvi vector<vector<int>>
#define vll vector<long long>
#define pii pair<int, int>
#define vpii vector<pair<int, int>>
using namespace std;

ll M = MOD;
ll mpow(ll x,
        ll n) { // x^n(mod M) ←普通にpow(x,n)では溢れてしまうため，随時mod計算
  ll ans = 1;
  while (n != 0) {
    if (n & 1)
      ans = ans * x % M;
    x = x * x % M;
    n = n >> 1;
  }
  return ans;
}

int main() {
  int N;
  cin >> N;
  ll cnt = 0;
  for (int i = 1; i <= N; i++) {
    string s = to_string(i);
    string t = "";

    if (i % 10 == 0) {
      // cout << i << " " << cnt << endl;
      continue;
    }
    t.push_back(s[s.size() - 1]);
    t.push_back(s[0]);
    if (s[0] == s[s.size() - 1]) {
      cnt++;
    }

    while (t.size() < to_string(N).size()) {
      cnt += mpow(10, t.size() - 2);
      t.insert(1, "0");
    }
    // tの桁数 == Nの桁数

    if (stoi(t) > N) {
      // cout <<  i<< " " << cnt << endl;
      continue;
    }
    // このとき t <= N
    // 先頭の桁で場合分け
    if (t[0] < to_string(N)[0]) {
      cnt += mpow(10, t.size() - 2);
    } else { // 先頭の値が同じ
      if (t[t.size() - 1] <= to_string(N)[to_string(N).size() - 1]) {
        // tの末尾がNの末尾未満->10のpowerでよい
        //  t = 1003 N = 1xx4,11xx3
        ll temp = 0;
        if (to_string(N).size() > 2) {
          temp += stoi(to_string(N).substr(1, to_string(N).size() - 2));
        }
        cnt += temp + 1;
      } else {
        // t = 1003 N = 1xx2
        ll temp = stoi(to_string(N).substr(1, to_string(N).size() - 2));
        cnt += temp;
      }
    }

    // cout << i << " " << cnt << endl;
  }

  cout << cnt << endl;
}