#include <bits/stdc++.h>
#include<limits.h>
#include<stdio.h>
#include<cstring>
#include<string>
using namespace  std;
typedef long long ll;
typedef long double ld;
#define fast ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pb push_back
#define mp make_pair
#define sz(a) a.size()
#define fi first
#define se second
#define rsz(a,n) a.resize(n)
#define test(t) ll t;cin>>t;while(t--)
#define forn(i,e) for(int i = 0; i < e; i++)
#define forsn(i,s,e) for(int i = s; i < e; i++)
#define rforn(i,s) for(int i = s; i >= 0; i--)
#define rforsn(i,s,e) for(int i = s; i >= e; i--)
#define fillv(a,k) memset(a,k,sizeof(a))
#define leadzero(a) __builtin_clz(a) //count leading zeros
#define trailzero(a) __builtin_ctz(a) //count trailing zeros
#define bitcount(a) __builtin_popcount(a) // count set bits (add ll)
#define ln cout<<"\n"
// #define sp cout<<" "
#define spaceprint(a,i,s,n) {forsn(i,s,n) { cout<<a[i]; sp;}}
#define lineprint(a,i,s,n) {forsn(i,s,n) {cout<<a[i]; ln;}}
#define maxe(a) *max_element(a.begin(),a.end())
#define maxi(a) max_element(a.begin(),a.end())-a.begin()
#define mine(a) *min_element(a.begin(),a.end())
#define mini(a) min_element(a.begin(),a.end())-a.begin()
#define all(c) c.begin(),c.end()
#define trav(container, it) for(typeof(container.begin()) it = container.begin(); it != container.end(); it++)
#define present(container, element) (container.find(element) != container.end())
#define cpresent(container, element)  (find(all(container),element) != container.end())// check the presence of element
//copy(from_begin, from_end, to_begin); copy function
typedef unsigned long long int ull;
typedef long double ld;
typedef pair<ll,ll> p64;
typedef pair<int,int> p32;
typedef pair<int,p32> p96;
typedef vector<ll> v64;
typedef vector<string> vs;
typedef vector<int> v32;
typedef vector<v32> vv32;
typedef vector<v64> vv64;
typedef vector<p32> vp32;
typedef vector<p64> vp64;
typedef vector<vp32> vvp32;
typedef map<int,int> m32;
typedef map<ll,ll> m64;
const int LIM = 1e5+5, MOD =  1e9;
#define sumv(v) accumulate(all(v),ll(0))
#define productv(v) accumulate(all(v), ll(1), multiplies< ll >())
ll gcd(ll a, ll b) { if(b == 0) return a; return gcd(b, a % b); }
ll fastpowMOD(ll a, ll p,ll MOD){ if(p==0) return 1; ll z = fastpowMOD(a,p/2,MOD); z = (z*z)%MOD; if(p%2) z = (z*a)%MOD; return z; }
bool seive[100005];
void SieveOfEratosthenes(ll n)
{ memset(seive, true, sizeof(seive)); for (ll p=2; p*p<=n; p++) if (seive[p] == true) for (ll i=p*p; i<=n; i += p) seive[i] = false; }
// ll a[11*LIM]={0},b[11*LIM]={0};
// vp64 v[LIM];
typedef struct 
{
	ll one,two,three;
}data;


ll mod=1e9+7;
vp64 pf (ll n)
{
	vp64 v;
	ll c=0;
	while (n%2==0)
	{
		n/=2;
		c++;
	}
	if (c)
	v.pb({2,c});
	for (ll i=3;i<=sqrt(n);i+=2)
	{
		ll c=0;
		while (n%i==0)
		{
			n/=i;
			c++;
		}
		if (c)
		v.pb({i,c});
	}
	if (n!=1)
	{
		v.pb({n,1});
	}
	return v;
}

// string s,val;
// ll k;



v64 tin,tout;
vv64 up;
ll timer;
ll l;


void dfs(ll v, ll p,v64 adj[])
{
    // cout<<"check";
    tin[v] = ++timer;
    up[v][0] = p;
    for (ll i = 1; i <= l; ++i)
        up[v][i] = up[up[v][i-1]][i-1];

    for (auto  u : adj[v]) {
        if (u != p)
            dfs(u, v,adj);
    }

    tout[v] = ++timer;
}

bool is_ancestor(ll u, ll v)
{
    return tin[u] <= tin[v] && tout[u] >= tout[v];
}

ll lca(ll u, ll v)
{
    if (is_ancestor(u, v))
        return u;
    if (is_ancestor(v, u))
        return v;
    for (ll i = l; i >= 0; --i) {
        if (!is_ancestor(up[u][i], v))
            u = up[u][i];
    }
    return up[u][0];
}

// void preprocess(ll root, v64 &tin, v64 &tout,ll timer,vv64 &up,v64 adj[], ll l,ll n) {
    
//     // timer = 0;
//     // l = ceil(log2(n));
//     dfs(root, root,tin,up,adj,timer,tout,l);
//     // for (auto x:adj[1])
//     // 	cout<<x<<" ";

// }
unordered_map <ll,ll> factors[100004];
void dfs2 (ll u, ll p, v64 adj[],unordered_map <ll,vp64> m)
{
	if (u!=1)
	{
		for (auto x:m[u])
		{
			factors[u].insert({x.fi,x.se});
		}
		for (auto x:factors[p])
		{
			if (factors[u].find(x.fi)==factors[u].end())
				factors[u].insert({x.fi,x.se});
			else
				factors[u][x.fi]+=x.se;
		}
	}
	for (auto x:adj[u])
	{
		if (x!=p)
		{
			dfs2(x,u,adj,m);
		}
	}
}

int main()
{
	fast;
	ll n,k;
	cin>>n>>k;
	ll ans=0;
	ll dp[k+1];
	memset(dp,0,sizeof(dp));
	dp[k]=1;
	ans=k;
	for (ll i=k-1;i>=1;i--)
	{
		dp[i]=fastpowMOD(k/i,n,mod);
		for (ll j=2*i;j<=k;j+=i)
			dp[i]=(dp[i]-dp[j]+mod)%mod;
		ans=(ans+i*dp[i])%mod;
	}
	cout<<ans%mod;
}

Measured memory_bytes: 9900