#include<bits/stdc++.h>
#define rep(i,N) for(int i=0;i<(N);i++)
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
using namespace std;
const long long MOD = 1e9 + 7;
const long long INF = 1e12;
const int inf = 1e9;
typedef long long ll;
typedef pair<ll,int> P;
typedef set<int> S;
ll n,k;
int prime[100010];
bool is_prime[100010];
int sieve(int n){
    int p=0;
    for(int i=0;i<=n;i++) is_prime[i]=true;
    is_prime[0]=is_prime[1]=false;
    for(int i=2;i<=n;i++){
        if(is_prime[i]){
            prime[p++]=i;
            for(int j=2*i;j<=n;j+=i) is_prime[j]=false;
        }
    }
}
int main(){
    cin>>n>>k;
    int a = sieve(k); //k以下の素数を求める
    ll ans=0;
    for(int i=2;i<=k;i++){
        if(is_prime[i]){
            int cnt=0;
            int copy=i;
            while(copy<=k){
                copy+=i;
                cnt++;
            }
            int copy2=cnt;
            while(cnt>=0){
                if(cnt==0){
                    ans+=1;
                }
                else{
                    ll aaa=pow(copy2-cnt,n-1)%MOD
                    ans+=aaa;
                } 
                //ans+=pow(copy2-cnt,n-1)%MOD;
            }
        }
    }
    ans+=pow(a,n-1);
    cout<<ans<<endl;
    return 0;
}