Problem p02715 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
/*
#include<boost/multiprecision/cpp_int.hpp>
namespace mp=boost::multiprecision;
*/
using namespace std;
#define ll long long int
#define lo mp::cpp_int
#define pb push_back
#define pob pop_back
#define mp make_pair
#define endl "\n"
#define ce(x) cout << x << "\n"
#define fill(s, v) memset(s, v, sizeof(s))
#define speed                                                                  \
  {                                                                            \
    ios_base::sync_with_stdio(false);                                          \
    cin.tie(0);                                                                \
  }
#define deb(x) cout << #x << " " << x << endl;
#define INFINITE 1000000009
#define ull unsigned long long int
#define take(a, n)                                                             \
  for (ll pp = 0; pp < n; pp++) {                                              \
    cin >> a[pp];                                                              \
  }
#define take2(a, n)                                                            \
  for (ll p = 0; p < n; p++) {                                                 \
    yo temp;                                                                   \
    cin >> temp;                                                               \
    a.pb(temp);                                                                \
  }
#define f(i, n) for (ll i = 0; i < n; i++)
#define f1(i, a, n) for (ll i = a; i < n; i++)
#define show(a, n)                                                             \
  for (ll p = 0; p < n; p++)                                                   \
    cout << a[p] << " ";
#define _ << " " <<
#define nl cout << endl;
#define sq(x) ((x) * (x))
#define call(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define ff first
#define ss second
#define lld long double
#define sc(n) scanf("%lld", &n);
#define de2(x, y)                                                              \
  cout << #x << " = " << (x) << ' ' << #y << " = " << y << endl;               \
  typedef pair<int, int> pii;
#define copy(b, a, n)                                                          \
  for (ll i = 0; i < n; i++)                                                   \
    b[i] = a[i];
#define tc(tt)                                                                 \
  ll tt;                                                                       \
  cin >> tt;                                                                   \
  for (int _tt = 0; _tt < tt; _tt++)
typedef vector<vector<ll>> matrix;
typedef pair<ll, ll> pii;
typedef vector<pii> vii;
typedef vector<ll> vi;
const ll dx[4] = {-1, 0, 1, 0};
const ll dy[4] = {0, -1, 0, 1};
const ll mod = 1000000007;
ll gcd(ll a, ll b) {
  if (!b)
    return a;
  return gcd(b, a % b);
}
// ll power_mod(ll x,ll y,ll p){ll
// res=1;x%=p;while(y>0){if(y&1)res=(res*x)%p;y=y>>1;x=(x*x)%p;}return res;}
ll modexpo(ll x, ll n, ll M) {
  if (n == 0)
    return 1;
  else if (n % 2 == 0)
    return modexpo((x * x) % M, n / 2, M);
  else
    return (x * modexpo((x * x) % M, (n - 1) / 2, M)) % M;
}
ll lcm(ll a, ll b) { return (a * b) / gcd(a, b); }
ll sumofdigits(ll n) {
  ll out = 0;
  while (n) {
    out += (n % 10);
    n /= 10;
  }
  return out;
}
bool isPrime(ll n) {
  if (n <= 1)
    return false;
  if (n <= 3)
    return true;
  if (n % 2 == 0 || n % 3 == 0)
    return false;
  for (ll i = 5; i * i <= n; i = i + 6)
    if (n % i == 0 || n % (i + 2) == 0)
      return false;
  return true;
}
// ll power(ll a,ll b){if(b==0)return 1;if(b&1)return a*power(a,b-1);ll
// res=power(a,b/2);return res*res;}
ll bexpo(ll x, ll n) {
  if (n == 0)
    return 1;
  else if (n % 2 == 0)
    return bexpo(x * x, n / 2);
  else
    return x * bexpo(x * x, (n - 1) / 2);
}
ll log(ll d) { return log2(d); }
bool isPower(ll x, ll y) {
  if (x == 1)
    return (y == 1);
  ll pow = 1;
  while (pow < y)
    pow *= x;
  return (pow == y);
}
bool isPerfectSquare(long double x) {
  long double sr = sqrt(x);
  return ((sr - floor(sr)) == 0);
}
bool compare(const pair<ll, ll> &a, const pair<ll, ll> &b) {
  return (a.second < b.second);
}
ll isPalindrome(string s) {
  ll l = 0;
  ll h = s.size() - 1;
  while (h > l) {
    if (s[l++] != s[h--])
      return 0;
  }
  return 1;
}
ll setbits(ll n) {
  if (n == 0)
    return 0;
  else
    return 1 + setbits(n & (n - 1));
}
ll modInverse(ll A, ll M) { return modexpo(A, M - 2, M); }
//------modular inverse by extended euclid-------//

// ll d, x, y;
// void extendedEuclid(ll A, ll B) {
//  if(B == 0) {
//  d = A;
//  x = 1;
//  y = 0;
//  }
//  else {
//  extendedEuclid(B, A%B);
//  ll temp = x;
//  x = y;
//  y = temp - (A/B)*y;
//  }
// }

// ll modInverse2(ll A, ll M){
// extendedEuclid(A,M);
// return (x%M+M)%M;
// }

//---------------------------------//

//---------------matrix exponentiation-------------------//

// matrix mul(matrix a,matrix b){
//   matrix res(n+1,vector<ll>(n+1));
//   f(i,n)f(j,n)f(k,n)res[i][j]=(res[i][j]%mod+((a[i][k]%mod)*(b[k][j]%mod))%mod)%mod;
//    return res;
// }
// matrix pow(matrix A,ll p) {
//     if(p==1) return A;
//     matrix res=pow(A,p/2) ;
//     res=mul(res,res);
//     if(p&1) res=mul(res,A) ;
//     return res;
// }

//-------------------------------------------------//

vector<ll> factorize(ll n) {
  vector<ll> res;
  for (ll i = 2; i * i <= n; ++i) {
    while (n % i == 0) {
      res.push_back(i);
      n /= i;
    }
  }
  if (n != 1) {
    res.push_back(n);
  }
  return res;
}

vector<ll> divisors(ll n) {
  vector<ll> res;
  for (ll i = 1; i <= sqrt(n); i++) {
    if (n % i == 0) {
      if (n / i == i) {
        res.pb(i);
      } else {
        res.pb(n / i);
        res.pb(i);
      }
    }
  }
  return res;
}
vector<ll> primeFactors(ll n) {
  if (n == 1)
    return vector<ll>(1, 1);
  bool idx[1] = {false};
  vector<ll> res;
  while (n % 2 == 0) {
    if (!idx[1]) {
      idx[1] = true;
      res.pb(2);
    }
    n = n / 2;
  }
  for (ll i = 3; i * i <= n; i += 2) {
    bool once = false;
    while (n % i == 0) {
      if (!once) {
        res.pb(i);
        once = true;
      }
      n = n / i;
    }
  }
  if (n > 2)
    res.pb(n);
  return res;
}

ll phi(ll n) {
  float result = n;
  for (ll p = 2; p * p <= n; ++p) {
    if (n % p == 0) {
      while (n % p == 0)
        n /= p;
      result *= (1.0 - (1.0 / (float)p));
    }
  }
  if (n > 1)
    result *= (1.0 - (1.0 / (float)n));
  return (ll)result % mod;
}

ll phi2(ll n) {
  ll m = n;
  double ans = n;
  for (ll i = 2; i * i <= n; i++) {
    ll count = 0;
    while (n > 1 && n % i == 0) {
      n = n / i;
      count++;
    }
    if (count > 0) {
      ans = ans * (1.0 - (1.0 / i));
    }
  }
  if (n > 1) {
    ans = ans * (1.0 - (1.0 / n));
  }
  ll ans2 = ans;
  return ans2 % mod;
}

//-------------dfs------------------//

// ll n;
// 100005
// vector<ll> ed[100005];
// vector<ll> vec[100005];
// bool check[100005];
// ll com[100005];
// ll nodes;

// void dfs(ll n){
//  nodes++;
//  check[n]=true;
//  for(ll i=0;i<ed[n].size();i++){
//      if(!check[ed[n][i]]){
//          dfs(ed[n][i]);
//      }
//  }
// }

//--------------------------------------------//

ll djikshtra(ll n, vector<pii> graph[], ll src, ll dst) {
  vector<ll> dist(n + 1, LONG_MAX);
  priority_queue<pii, vector<pii>, greater<pii>> heap;
  vector<bool> visited(n + 1, false);
  dist[src] = 0;
  heap.push({dist[src], src});
  while (!heap.empty()) {
    pii curr = heap.top();
    heap.pop();
    if (visited[curr.second])
      continue;
    visited[curr.second] = true;
    for (auto it : graph[curr.second]) {
      if (visited[it.first])
        continue;
      if (dist[it.first] > dist[curr.second] + it.second) {
        dist[it.first] = dist[curr.second] + it.second;
        heap.push({dist[it.first], it.first});
      }
    }
    if (curr.second == dst)
      break;
  }
  return dist[dst];
}

ll dxx[] = {1, 1, 0, -1, -1, -1, 0, 1};
ll dyy[] = {0, 1, 1, 1, 0, -1, -1, -1};

//----check if a point is in range-----///

// bool check(ll x,ll y){return(x>=0&&x<n&&y>=0&&y<m);}

//--------------------------------------------////

//---sieve of eranthoses------//

// #define size 1000001
// char prim[1000001];
// ll sum[1000001];

// void gen()
// {
//     for(ll i=2; i*i<size;++i)
//     {
//         if(prim[i]==0) // i is a prime number
//         {
//             for(ll j=i<<1;j<size; j+=i)
//                 prim[j] = 1; // j is not a prime number
//         }
//     }
//     sum[0] = sum[1] = 0;
//     for(ll i = 2; i < size; ++i)
//     {
//         sum[i] = prim[i] == 0;
//         if(i)
//             sum[i] += sum[i - 1];
//     }
// }

//------------------------//
const int FULL_MASK = (1 << 10) - 1;

void solve() {
  ll n, k;
  cin >> n >> k;
  std::vector<ll> dp(n + 1, 0);
  for (ll gd = k; gd > 0; gd--) {
    ll temp = k / gd;
    temp = modexpo(temp, n, mod);
    ll ex = 0;
    for (ll j = (2 * gd); j <= k; j += gd) {
      ex = (ex + dp[j]) % mod;
    }
    dp[gd] = (temp - ex + mod) % mod;
  }
  ll ans = 0;
  for (ll i = 1; i <= k; i++) {
    ans = (ans + (dp[i] * i) % mod) % mod;
  }
  ce(ans % mod);
}

int main() {
  // speed
  // tc(tt){
  solve();
  // }
}

/*
7
RGRBGRB
39
RBRBGRBGGBBRRGBBRRRBGGBRBGBRBGBRBBBGBBB

*/       // cout<<"1st dif->"<<endl;
    //  for(auto it:dif1){
    //     cout<<it.ff<<" "<<it.ss<<endl;
    // }
    // cout<<"2nd dif->"<<endl;
    //  for(auto it:dif2){
    //     cout<<it.ff<<" "<<it.ss<<endl;
    // }
    // nl

Fixed submission:
#include <bits/stdc++.h>
/*
#include<boost/multiprecision/cpp_int.hpp>
namespace mp=boost::multiprecision;
*/
using namespace std;
#define ll long long int
#define lo mp::cpp_int
#define pb push_back
#define pob pop_back
#define mp make_pair
#define endl "\n"
#define ce(x) cout << x << "\n"
#define fill(s, v) memset(s, v, sizeof(s))
#define speed                                                                  \
  {                                                                            \
    ios_base::sync_with_stdio(false);                                          \
    cin.tie(0);                                                                \
  }
#define deb(x) cout << #x << " " << x << endl;
#define INFINITE 1000000009
#define ull unsigned long long int
#define take(a, n)                                                             \
  for (ll pp = 0; pp < n; pp++) {                                              \
    cin >> a[pp];                                                              \
  }
#define take2(a, n)                                                            \
  for (ll p = 0; p < n; p++) {                                                 \
    yo temp;                                                                   \
    cin >> temp;                                                               \
    a.pb(temp);                                                                \
  }
#define f(i, n) for (ll i = 0; i < n; i++)
#define f1(i, a, n) for (ll i = a; i < n; i++)
#define show(a, n)                                                             \
  for (ll p = 0; p < n; p++)                                                   \
    cout << a[p] << " ";
#define _ << " " <<
#define nl cout << endl;
#define sq(x) ((x) * (x))
#define call(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
#define ff first
#define ss second
#define lld long double
#define sc(n) scanf("%lld", &n);
#define de2(x, y)                                                              \
  cout << #x << " = " << (x) << ' ' << #y << " = " << y << endl;               \
  typedef pair<int, int> pii;
#define copy(b, a, n)                                                          \
  for (ll i = 0; i < n; i++)                                                   \
    b[i] = a[i];
#define tc(tt)                                                                 \
  ll tt;                                                                       \
  cin >> tt;                                                                   \
  for (int _tt = 0; _tt < tt; _tt++)
typedef vector<vector<ll>> matrix;
typedef pair<ll, ll> pii;
typedef vector<pii> vii;
typedef vector<ll> vi;
const ll dx[4] = {-1, 0, 1, 0};
const ll dy[4] = {0, -1, 0, 1};
const ll mod = 1000000007;
ll gcd(ll a, ll b) {
  if (!b)
    return a;
  return gcd(b, a % b);
}
// ll power_mod(ll x,ll y,ll p){ll
// res=1;x%=p;while(y>0){if(y&1)res=(res*x)%p;y=y>>1;x=(x*x)%p;}return res;}
ll modexpo(ll x, ll n, ll M) {
  if (n == 0)
    return 1;
  else if (n % 2 == 0)
    return modexpo((x * x) % M, n / 2, M);
  else
    return (x * modexpo((x * x) % M, (n - 1) / 2, M)) % M;
}
ll lcm(ll a, ll b) { return (a * b) / gcd(a, b); }
ll sumofdigits(ll n) {
  ll out = 0;
  while (n) {
    out += (n % 10);
    n /= 10;
  }
  return out;
}
bool isPrime(ll n) {
  if (n <= 1)
    return false;
  if (n <= 3)
    return true;
  if (n % 2 == 0 || n % 3 == 0)
    return false;
  for (ll i = 5; i * i <= n; i = i + 6)
    if (n % i == 0 || n % (i + 2) == 0)
      return false;
  return true;
}
// ll power(ll a,ll b){if(b==0)return 1;if(b&1)return a*power(a,b-1);ll
// res=power(a,b/2);return res*res;}
ll bexpo(ll x, ll n) {
  if (n == 0)
    return 1;
  else if (n % 2 == 0)
    return bexpo(x * x, n / 2);
  else
    return x * bexpo(x * x, (n - 1) / 2);
}
ll log(ll d) { return log2(d); }
bool isPower(ll x, ll y) {
  if (x == 1)
    return (y == 1);
  ll pow = 1;
  while (pow < y)
    pow *= x;
  return (pow == y);
}
bool isPerfectSquare(long double x) {
  long double sr = sqrt(x);
  return ((sr - floor(sr)) == 0);
}
bool compare(const pair<ll, ll> &a, const pair<ll, ll> &b) {
  return (a.second < b.second);
}
ll isPalindrome(string s) {
  ll l = 0;
  ll h = s.size() - 1;
  while (h > l) {
    if (s[l++] != s[h--])
      return 0;
  }
  return 1;
}
ll setbits(ll n) {
  if (n == 0)
    return 0;
  else
    return 1 + setbits(n & (n - 1));
}
ll modInverse(ll A, ll M) { return modexpo(A, M - 2, M); }
//------modular inverse by extended euclid-------//

// ll d, x, y;
// void extendedEuclid(ll A, ll B) {
//  if(B == 0) {
//  d = A;
//  x = 1;
//  y = 0;
//  }
//  else {
//  extendedEuclid(B, A%B);
//  ll temp = x;
//  x = y;
//  y = temp - (A/B)*y;
//  }
// }

// ll modInverse2(ll A, ll M){
// extendedEuclid(A,M);
// return (x%M+M)%M;
// }

//---------------------------------//

//---------------matrix exponentiation-------------------//

// matrix mul(matrix a,matrix b){
//   matrix res(n+1,vector<ll>(n+1));
//   f(i,n)f(j,n)f(k,n)res[i][j]=(res[i][j]%mod+((a[i][k]%mod)*(b[k][j]%mod))%mod)%mod;
//    return res;
// }
// matrix pow(matrix A,ll p) {
//     if(p==1) return A;
//     matrix res=pow(A,p/2) ;
//     res=mul(res,res);
//     if(p&1) res=mul(res,A) ;
//     return res;
// }

//-------------------------------------------------//

vector<ll> factorize(ll n) {
  vector<ll> res;
  for (ll i = 2; i * i <= n; ++i) {
    while (n % i == 0) {
      res.push_back(i);
      n /= i;
    }
  }
  if (n != 1) {
    res.push_back(n);
  }
  return res;
}

vector<ll> divisors(ll n) {
  vector<ll> res;
  for (ll i = 1; i <= sqrt(n); i++) {
    if (n % i == 0) {
      if (n / i == i) {
        res.pb(i);
      } else {
        res.pb(n / i);
        res.pb(i);
      }
    }
  }
  return res;
}
vector<ll> primeFactors(ll n) {
  if (n == 1)
    return vector<ll>(1, 1);
  bool idx[1] = {false};
  vector<ll> res;
  while (n % 2 == 0) {
    if (!idx[1]) {
      idx[1] = true;
      res.pb(2);
    }
    n = n / 2;
  }
  for (ll i = 3; i * i <= n; i += 2) {
    bool once = false;
    while (n % i == 0) {
      if (!once) {
        res.pb(i);
        once = true;
      }
      n = n / i;
    }
  }
  if (n > 2)
    res.pb(n);
  return res;
}

ll phi(ll n) {
  float result = n;
  for (ll p = 2; p * p <= n; ++p) {
    if (n % p == 0) {
      while (n % p == 0)
        n /= p;
      result *= (1.0 - (1.0 / (float)p));
    }
  }
  if (n > 1)
    result *= (1.0 - (1.0 / (float)n));
  return (ll)result % mod;
}

ll phi2(ll n) {
  ll m = n;
  double ans = n;
  for (ll i = 2; i * i <= n; i++) {
    ll count = 0;
    while (n > 1 && n % i == 0) {
      n = n / i;
      count++;
    }
    if (count > 0) {
      ans = ans * (1.0 - (1.0 / i));
    }
  }
  if (n > 1) {
    ans = ans * (1.0 - (1.0 / n));
  }
  ll ans2 = ans;
  return ans2 % mod;
}

//-------------dfs------------------//

// ll n;
// 100005
// vector<ll> ed[100005];
// vector<ll> vec[100005];
// bool check[100005];
// ll com[100005];
// ll nodes;

// void dfs(ll n){
//  nodes++;
//  check[n]=true;
//  for(ll i=0;i<ed[n].size();i++){
//      if(!check[ed[n][i]]){
//          dfs(ed[n][i]);
//      }
//  }
// }

//--------------------------------------------//

ll djikshtra(ll n, vector<pii> graph[], ll src, ll dst) {
  vector<ll> dist(n + 1, LONG_MAX);
  priority_queue<pii, vector<pii>, greater<pii>> heap;
  vector<bool> visited(n + 1, false);
  dist[src] = 0;
  heap.push({dist[src], src});
  while (!heap.empty()) {
    pii curr = heap.top();
    heap.pop();
    if (visited[curr.second])
      continue;
    visited[curr.second] = true;
    for (auto it : graph[curr.second]) {
      if (visited[it.first])
        continue;
      if (dist[it.first] > dist[curr.second] + it.second) {
        dist[it.first] = dist[curr.second] + it.second;
        heap.push({dist[it.first], it.first});
      }
    }
    if (curr.second == dst)
      break;
  }
  return dist[dst];
}

ll dxx[] = {1, 1, 0, -1, -1, -1, 0, 1};
ll dyy[] = {0, 1, 1, 1, 0, -1, -1, -1};

//----check if a point is in range-----///

// bool check(ll x,ll y){return(x>=0&&x<n&&y>=0&&y<m);}

//--------------------------------------------////

//---sieve of eranthoses------//

// #define size 1000001
// char prim[1000001];
// ll sum[1000001];

// void gen()
// {
//     for(ll i=2; i*i<size;++i)
//     {
//         if(prim[i]==0) // i is a prime number
//         {
//             for(ll j=i<<1;j<size; j+=i)
//                 prim[j] = 1; // j is not a prime number
//         }
//     }
//     sum[0] = sum[1] = 0;
//     for(ll i = 2; i < size; ++i)
//     {
//         sum[i] = prim[i] == 0;
//         if(i)
//             sum[i] += sum[i - 1];
//     }
// }

//------------------------//
const int FULL_MASK = (1 << 10) - 1;

void solve() {
  ll n, k;
  cin >> n >> k;
  std::vector<ll> dp(k + 1, 0);
  for (ll gd = k; gd > 0; gd--) {
    ll temp = k / gd;
    temp = modexpo(temp, n, mod);
    ll ex = 0;
    for (ll j = (2 * gd); j <= k; j += gd) {
      ex = (ex + dp[j]) % mod;
    }
    dp[gd] = (temp - ex + mod) % mod;
  }
  ll ans = 0;
  for (ll i = 1; i <= k; i++) {
    ans = (ans + (dp[i] * i) % mod) % mod;
  }
  ce(ans % mod);
}

int main() {
  // speed
  // tc(tt){
  solve();
  // }
}

/*
7
RGRBGRB
39
RBRBGRBGGBBRRGBBRRRBGGBRBGBRBGBRBBBGBBB

*/       // cout<<"1st dif->"<<endl;
    //  for(auto it:dif1){
    //     cout<<it.ff<<" "<<it.ss<<endl;
    // }
    // cout<<"2nd dif->"<<endl;
    //  for(auto it:dif2){
    //     cout<<it.ff<<" "<<it.ss<<endl;
    // }
    // nl