//https://blog.csdn.net/qq_43765333/article/details/105489635

#include <bits/stdc++.h>
#define rep(i,n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<int,int>;
#define chmax(x,y) x = max(x,y)
#define chmin(x,y) x = min(x,y)

const int mod = 1000000007;
struct mint {
ll x; 
mint(ll x=0):x((x%mod+mod)%mod){}
mint operator-() const { return mint(-x);}
mint& operator+=(const mint a) {
if ((x += a.x) >= mod) x -= mod;
return *this;
 }
mint& operator-=(const mint a) {
if ((x += mod-a.x) >= mod) x -= mod;
return *this;
 }
 mint& operator*=(const mint a) {
(x *= a.x) %= mod;
return *this;
}
mint operator+(const mint a) const {
mint res(*this);
return res+=a;
}
mint operator-(const mint a) const {
mint res(*this);
return res-=a;
}
 mint operator*(const mint a) const {
mint res(*this);
return res*=a;
}
mint pow(ll t) const {
if (!t) return 1;
mint a = pow(t>>1);
a *= a;
if (t&1) a *= *this;
return a;
}
 mint inv() const {
return pow(mod-2);
 }
  mint& operator/=(const mint a) {
return (*this) *= a.inv();
 }
mint operator/(const mint a) const {
mint res(*this);
return res/=a;
 }
};

int main() {
ios::sync_with_stdio(false);
cin.tie(0);

ll n,k;
cin>>n>>k;

//dp[i]表示最大公约数为i的gcd(k1,k2,..,kn)的数量
mint dp[k+1],ans=0;
for(ll i=k;i>=1;i--){
    dp[i]=mint(k/i).pow(n);
    //消除重复的情况
    for(ll j=2*i;j<=k;j+=i)d[i]-=dp[j];
    ans+=dp[i];
}
cout<<ans.x<<endl;
return 0;
}