Problem p02715 (C++) — buggy submission, verdict: Runtime Error

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>    // assert
#include <cmath>      // abs など
#include <functional> // greater など
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric> // accumulate, gcd など
#include <queue>
#include <set>
#include <stdexcept>
#include <string>
#include <tuple>
#include <vector>
using namespace std;

// #include <boost/multiprecision/cpp_int.hpp>
// using namespace boost::multiprecision;

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
typedef long long ll;
// typedef int128_t ll;
// typedef cpp_int ll;

// GCC, 配列のアクセスなど
#define _GLIBCXX_DEBUG
// Clang, 配列のアクセスなど
#define _LIBCPP_DEBUG 0

//////////////// //////////////// //////////////// ////////////////
///////////////////
//////////////// //////////////// //////////////// ////////////////
///////////////////

constexpr inline ll mod = 1'000'000'007;

constexpr inline int max_n = 100'000 + 5;
vector<ll> xs(max_n + 1); // xs[d] = #{ d % gcd == 0 }
vector<ll> ys(max_n + 1); // ys[d] = #{ d == gcd }

ll modpow(ll x, int y) {
  if (y == 0) {
    return 1;
  }
  if (y % 2 == 0) {
    ll res = modpow(x, y / 2);
    return res * res % mod;
  } else {
    return modpow(x, y - 1) * x % mod;
  }
}

int main() {
  // 高速な入出力
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout << setprecision(15); // 浮動小数の表示の精度

  int n, k;
  cin >> n >> k;

  ll res = 0;
  for (int d = 1; d <= k; d++) {
    ll c = k / d; // 倍数の個数
    xs[d] = modpow(c, n);
  }
  for (int d = k; d >= 1; d--) {
    ys[d] = xs[d];
    for (int i = 2; d * i <= k; i++) {
      int d2 = d * i;
      ys[d] -= ys[d2] - mod;
      ys[d] %= mod;
    }
  }
  for (int d = 1; d <= k; d++) {
    res += d * ys[d];
    res %= mod;
  }
  cout << res << endl;

  return 0;
}


Error: 0

Fixed submission:

#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>    // assert
#include <cmath>      // abs など
#include <functional> // greater など
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric> // accumulate, gcd など
#include <queue>
#include <set>
#include <stdexcept>
#include <string>
#include <tuple>
#include <vector>
using namespace std;

// #include <boost/multiprecision/cpp_int.hpp>
// using namespace boost::multiprecision;

#define rep(i, n) for (int i = 0; i < (int)(n); i++)
typedef long long ll;
// typedef int128_t ll;
// typedef cpp_int ll;

// GCC, 配列のアクセスなど
#define _GLIBCXX_DEBUG
// Clang, 配列のアクセスなど
#define _LIBCPP_DEBUG 0

//////////////// //////////////// //////////////// ////////////////
///////////////////
//////////////// //////////////// //////////////// ////////////////
///////////////////

constexpr inline ll mod = 1'000'000'007;

ll modpow(ll x, int y) {
  if (y == 0) {
    return 1;
  }
  if (y % 2 == 0) {
    ll res = modpow(x, y / 2);
    return res * res % mod;
  } else {
    return modpow(x, y - 1) * x % mod;
  }
}

int main() {
  // 高速な入出力
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout << setprecision(15); // 浮動小数の表示の精度

  int n, k;
  cin >> n >> k;

  vector<ll> xs(n + 1); // xs[d] = #{ d % gcd == 0 }
  vector<ll> ys(n + 1); // ys[d] = #{ d == gcd }
  ll res = 0;
  for (int d = 1; d <= k; d++) {
    ll c = k / d; // 倍数の個数
    xs[d] = modpow(c, n);
  }
  for (int d = k; d >= 1; d--) {
    ys[d] = xs[d];
    for (int i = 2; d * i <= k; i++) {
      int d2 = d * i;
      ys[d] -= ys[d2] - mod;
      ys[d] %= mod;
    }
  }
  for (int d = 1; d <= k; d++) {
    res += d * ys[d];
    res %= mod;
  }
  cout << res << endl;

  return 0;
}