#include <bits/stdc++.h>
const int MAXN = 2e6, Mod = 1e9 + 7;
int prn, prime[MAXN + 5], mu[MAXN + 5];
bool vis[MAXN + 5];
void sieve() {
  mu[1] = 1;
  for (int i = 2; i <= MAXN; i++) {
    if (!vis[i]) prime[++prn] = i, mu[i] = -1;
    for (int j = 1; j <= prn && 1ll * i * prime[j] <= MAXN; j++) {
      vis[i * prime[j]] = 1;
      if (i % prime[j] == 0) break;
      mu[i * prime[j]] = -mu[i];
    }
  }
}
int Quick_pow(int x, int po) {
  int Ans = 1;
  for (; po; po >>= 1, x = 1ll * x * x % Mod)
    if (po & 1) Ans = 1ll * Ans * x % Mod;
  return Ans;
}
int n, k, pw[MAXN + 5], delta[MAXN + 5];
int main() {
  sieve();
  scanf("%d %d", &n, &k);
  for (int i = 1; i <= k; i++) pw[i] = Quick_pow(i, n);
  for (int p = 1; p <= k; p++)
    for (int i = 1; i * p <= k; i++)
      delta[i * p] = (delta[i * p] +
                      (mu[p] * (pw[i] - pw[i - 1] + Mod) % Mod + Mod) % Mod) %
                     Mod;
  int Ans = 0;
  for (int i = 1; i <= k; i++) {
    delta[i] = (delta[i] + delta[i - 1]) % Mod;
    Ans = (Ans + (delta[i] ^ i)) % Mod;
  }
  printf("%d\n", Ans);
  return 0;
}
