#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
template <typename T>
inline void read(T &x) {
  char c;
  bool nega = 0;
  while ((!isdigit(c = getchar())) && (c != '-'))
    ;
  if (c == '-') {
    nega = 1;
    c = getchar();
  }
  x = c - 48;
  while (isdigit(c = getchar())) x = x * 10 + c - 48;
  if (nega) x = -x;
}
template <typename T>
inline void writep(T x) {
  if (x > 9) writep(x / 10);
  putchar(x % 10 + 48);
}
template <typename T>
inline void write(T x) {
  if (x < 0) {
    putchar('-');
    x = -x;
  }
  writep(x);
}
template <typename T>
inline void writeln(T x) {
  write(x);
  putchar('\n');
}
const ll base = 1000000007;
ll f[2000001];
ll g[2000001];
int p[2000001];
int n, k;
ll ans;
ll power(ll a, ll b) {
  if (b == 0) return 1;
  ll t = power(a, b / 2);
  t = (t * t) % base;
  if (b % 2) t = (t * a) % base;
  return t;
}
vector<pair<int, int> > primes;
vector<int> divisors;
void generate_divisors(int u, int v, int s) {
  if (u == primes.size()) {
    if (s != 1) divisors.push_back(s);
  } else {
    generate_divisors(u + 1, 0, s);
    if (v < primes[u].second) generate_divisors(u, v + 1, s * primes[u].first);
  }
}
int main() {
  read(n);
  read(k);
  for (int i = (2); i <= (k); i++)
    if (!p[i])
      for (int j = i; j <= k; j += i)
        if (!p[j]) p[j] = i;
  f[1] = 1;
  for (int i = (2); i <= (k); i++) {
    primes.clear();
    divisors.clear();
    {
      int u = i;
      while (u > 1) {
        primes.push_back(make_pair(p[u], 0));
        while (u % primes.back().first == 0) {
          u /= primes.back().first;
          primes.back().second++;
        }
      }
    }
    generate_divisors(0, 0, 1);
    g[i] = g[i - 1];
    for (int p : divisors) {
      g[i] -= f[i / p - 1];
      g[i] += f[i / p];
    }
    g[i] %= base;
    f[i] = (power(i, n) - g[i]) % base;
    f[i] = (f[i] + base) % base;
    ans = (ans + (f[i] ^ i)) % base;
  }
  writeln(ans);
}
