#include <bits/stdc++.h>   using namespace std;   const int mod = 1e9 + 7;   const long double eps = 1e-6;   const long double pi = acos(-1.0);   long double sign(long double x) { return (x > 0) - (x < 0); }   long long sign(long long x) { return (x > 0) - (x < 0); }   int sign(int x) { return (x > 0) - (x < 0); }   struct pt {     long double x, y;     pt() {}     pt(long double _x, long double _y) : x(_x), y(_y) {}     bool operator<(pt p) { return tie(x, y) < tie(p.x, p.y); }     bool operator==(pt p) { return tie(x, y) == tie(p.x, p.y); }     pt operator+(pt p) { return {x + p.x, y + p.y}; }     pt operator-(pt p) { return {x - p.x, y - p.y}; }     pt operator*(long double d) { return {x * d, y * d}; }     pt operator/(long double d) { return {x / d, y / d}; }     long double dot(pt p) { return x * p.x + y * p.y; }     long double det(pt p) { return x * p.y - y * p.x; }     long double cross(pt p, pt q) { return (p - *this).det(q - *this); }     long double dist() { return sqrtl(x * x + y * y); }     pt rot90() { return pt(-y, x); }     pt unit() { return *this / dist(); }     long double angle() { return atan2(y, x); }     pt rot(long double an) {       return {x * cos(an) - y * sin(an), x * sin(an) + y * cos(an)};     }     void read() { cin >> x >> y; }     void write() { cout <<  (  << x <<  ,  << y <<  )  << endl; }   };   struct seg {     pt fi, sc;     seg() {}     seg(pt _fi, pt _sc) : fi(_fi), sc(_sc) {}     long double dist(pt C) {       if (fi == sc) return (C - fi).dist();       long double d = pow((sc - fi).dist(), 2);       long double t = min(d, max((long double)0.0, (C - fi).dot(sc - fi)));       return ((C - fi) * d - (sc - fi) * t).dist() / d;     }     long double len() { return (fi - sc).dist(); }     bool on_seg(pt C) {       return abs(C.cross(fi, sc)) < eps && (fi - C).dot(sc - C) <= eps;     }     vector<pt> intersect(seg rhs) {       long double oa = rhs.fi.cross(rhs.sc, fi);       long double ob = rhs.fi.cross(rhs.sc, sc);       long double oc = fi.cross(sc, rhs.fi);       long double od = fi.cross(sc, rhs.sc);       if (sign(oa) * sign(ob) < 0 && sign(oc) * sign(od) < 0)         return {(fi * ob - sc * oa) / (ob - oa)};       vector<pt> ans;       if (rhs.on_seg(fi)) ans.push_back(fi);       if (rhs.on_seg(sc)) ans.push_back(sc);       if (on_seg(rhs.fi)) ans.push_back(rhs.fi);       if (on_seg(rhs.sc)) ans.push_back(rhs.sc);       return ans;     }   };   struct line {     long double a, b, c;     line(pt p1, pt p2) {       assert(!(p1 == p2));       a = p2.y - p1.y;       b = p1.x - p2.x;       c = a * p1.x + b * p1.y;     }     line() {}     line(long double _a, long double _b, long double _c) : a(_a), b(_b), c(_c) {}     long double dist(pt p) {       return fabs(a * p.x + b * p.y - c) / sqrtl(a * a + b * b);     }     pair<int, pt> intersect(line rhs) {       long double dett = a * rhs.b - b * rhs.a;       if (fabs(dett) <= eps) {         long double det2 = c * rhs.a - a * rhs.c;         if (fabs(det2) <= eps) return {-1, pt()};         return {0, pt()};       }       return {1,               pt((c * rhs.b - rhs.c * b) / dett, (a * rhs.c - c * rhs.a) / dett)};     }   };   pt reflect(pt A, line L) {     line perpendicular(-L.b, L.a, -L.b * A.x + L.a * A.y);     pt insect = perpendicular.intersect(L).second;     return insect * (long double)2.0 - A;   }   struct mint {     int val;     mint() { val = 0; }     mint(const long long& v) {       val = (-mod <= v && v < mod) ? v : v % mod;       if (val < 0) val += mod;     }     friend ostream& operator<<(ostream& os, const mint& a) { return os << a.val; }     friend bool operator==(const mint& a, const mint& b) {       return a.val == b.val;     }     friend bool operator!=(const mint& a, const mint& b) {       return a.val != b.val;     }     friend bool operator<(const mint& a, const mint& b) { return a.val < b.val; }     friend bool operator>(const mint& a, const mint& b) { return a.val > b.val; }     friend bool operator<=(const mint& a, const mint& b) {       return a.val <= b.val;     }     friend bool operator>=(const mint& a, const mint& b) {       return a.val >= b.val;     }     mint operator-() { return mint(-val); }     mint& operator+=(const mint& m) {       if ((val += m.val) >= mod) val -= mod;       return *this;     }     mint& operator-=(const mint& m) {       if ((val -= m.val) < 0) val += mod;       return *this;     }     mint& operator*=(const mint& m) {       val = (val * 1ll * m.val) % mod;       return *this;     }     friend mint pow(mint a, long long p) {       mint ans = 1;       for (; p; p /= 2, a *= a)         if (p % 2 == 1) ans *= a;       return ans;     }     friend mint inv(const mint& a) { return pow(a, mod - 2); }     mint& operator/=(const mint& m) { return (*this) *= inv(m); }     mint& operator^=(const mint& m) {       if ((val ^= m.val) >= mod) val -= mod;       return *this;     }     friend mint operator+(mint a, const mint& b) { return a += b; }     friend mint operator-(mint a, const mint& b) { return a -= b; }     friend mint operator*(mint a, const mint& b) { return a *= b; }     friend mint operator/(mint a, const mint& b) { return a /= b; }     friend mint operator^(mint a, const mint& b) { return a ^= b; }   };   int solve();   void precomp();   int main() {     ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);     int t = 1;     if (0) cin >> t;     if (0) cout << fixed << setprecision(10);     precomp();     for (int tc = 1; tc <= t; tc++) {       if (0 && 0) cout <<  Case #  << tc <<  :  ;       solve();     }   }   void precomp() { return; }   int n, k;   mint ans = 0, sum = 0, dp[2000005], pw[2000005];   int solve() {     cin >> n >> k;     for (int i = 1; i <= k; i++) pw[i] = pow(mint(i), n);     for (int i = 1; i <= k; i++) {       dp[i] += pw[i];       dp[i] -= pw[i - 1];       sum += dp[i];       ans += sum ^ i;       for (int j = i * 2; j <= k; j += i) dp[j] -= dp[i];     }     cout << ans << endl;     return 0;   }