#include<bits/stdc++.h>
using namespace std;
#define ll long long int
typedef unsigned long long int ull;
typedef long double ldb;
#define B 1000000007
#define rep(i,a,b) for(ll i=a;i<b;i++)
#define repi(i,a,b) for(ll i=b-1;i>=a;i--)
#define MT make_tuple
#define G(a,b) get<a>(b)
#define VI vector<int>
#define VLL vector<long long int>
#define pb push_back
#define mp make_pair
#define sz size()
#define ani ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
/*SOME BITMASK KNOWLEDGE
1)x & (x - 1):sets the last one bit of x to zero
power of two exactly when x & (x − 1) = 0.
2)x & -x:sets all the one bits to zero, except last one bit
3)x | (x - 1):inverts all the bits after the last one bit
4)(a^b) = (a|b)-(a&b) = (a+b-2*(a&b))
5)(a+b) = a^b + 2*(a&b)
6)   lowest set bit of N =n ^ ( n & (n-1));
7)    Turn off 1st set bit= n^(n&(-n));
8) clear all bits from MSB to ith bit  = n&((1<<i)-1);    
9) clear all bits from LSB= n&(~((1<<(i+1))-1))      
10) if a%m<0 then compute (a%m+m)%m    */


#define endl "\n"


ll gcd(ll  a, ll  b) { 
   if (b == 0) 
      return a; 
   return gcd(b, a % b);  
} 
 
ll lcm(ll a, ll b){ 
    return (a*b)/(gcd(a, b));
}


 ll power(ll x, ll y) 
{ 
    ll temp; 
    if( y == 0) 
        return 1; 
    temp = power(x, y/2); 
    if (y%2 == 0) 
        return temp*temp; 
    else
        return x*temp*temp; 
}
 
ll modulo( ll value, ll m) {
    ll mod = value % m;
    if (value < 0) {
        mod += m;
    }
    return mod;
}

ll bins(ll ar[],ll l,ll r,ll x) 
{ 
    if (r >= l) { 
        ll mid =l+((r-l)/2); 
        if(ar[mid]==x) 
            return mid; 
        if(ar[mid]>x) 
            return bins(ar,l,mid-1,x);
        return bins(ar,mid+1,r,x); 
    } 
    return -1; 
} 
 
ll nCr(ll n,ll k){ 
    ll C[n + 1][k + 1]; 
    ll i, j; 
    for (i=0;i<=n;i++){ 
        for(j=0;j<=min(i,k);j++){
            if(j==0||j==i) 
                C[i][j]=1;  
            else
                C[i][j]=C[i-1][j-1]+C[i-1][j]; 
        } 
    }
    return C[n][k]; 
} 
 
 
 ll decimalToBinary(ll N) 
{ 
  
    // To store the binary number 
    ll B_Number = 0; 
    ll cnt = 0; 
    while (N != 0) { 
        ll rem = N % 2; 
        ll c = pow(10, cnt); 
        B_Number += rem * c; 
        N /= 2; 
  
        // Count used to store exponent value 
        cnt++; 
    } 
  
    return B_Number; 
} 


int countFreq(string &pat, string &txt) 
{ 
    int M = pat.length(); 
    int N = txt.length(); 
    int res = 0; 
    
    /* A loop to slide pat[] one by one */
    for (int i = 0; i <= N - M; i++) 
    {  
        /* For current index i, check for  
           pattern match */
        int j; 
        for (j = 0; j < M; j++) 
            if (txt[i+j] != pat[j]) 
                break; 
   
        // if pat[0...M-1] = txt[i, i+1, ...i+M-1] 
        if (j == M)   
        {  
           res++; 
           j = 0; 
        } 
    } 
    return res; 
} 


int lis(int a[],int n)
{
    int b[n];
    b[0]=1;
    for (int i = 1; i < n; ++i)
    {
        b[i]=1;
    for(int j=i-1;j>=0;j--)
    {
        if(a[j]>a[i])
            continue;
        int p=b[j]+1;
        if(p>a[i])
            a[i]=p;
    }
    }
    int best=0;
    for (int i = 0; i < n; i++) {
        if (best < b[i]) {
            best = b[i];
        }
    }
return best;
}



int count_ways_to_make_change(int s[],int m,int n)
{
    int i,j,x,y;
    int table[n+1][m];

for( i=0;i<m;i++)
{ table[0][i]=1;
}

for(i=1;i<n+1;i++)
{
    for(j=0;j<m;j++)
    {
        x= (i-s[j]>=0) ? table[i-s[j]][j] : 0; //count of sols including s[j]
        y= (j>=1) ? table[i][j-1] : 0; // count of sols excluding s[j]

        table[i][j]=x+y;  //total count
    }

}
return table[n][m-1];

}


ll kadane(ll a[],ll n)
{
    ll curr=0;
    ll best=0;
    for(ll i=0;i<n;i++)
    {
        curr+=a[i];
        if(best<curr)
        {
            best=curr;
        }
        if(curr<0)
            curr=0;
    }
    return best;
}

int maxSum(int arr[], int n, int k) //maximum sum of a subarray of size k
{ 
    if (n < k) 
    { 
       cout << "Invalid"; 
       return -1; 
    } 

    int res = 0; 
    for (int i=0; i<k; i++) 
       res += arr[i]; 

    int curr_sum = res; 
    for (int i=k; i<n; i++) 
    { 
       curr_sum += arr[i] - arr[i-k]; 
       res = max(res, curr_sum); 
    } 
  
    return res; 
} 
  



ll modsum(ll a, ll b, ll m){
 
    return ((a%m)+(b%m))%m;
 
}
 
ll modmul(ll a, ll b, ll m){
 
    return ((a%m)*(b%m))%m;
 
 
}
 
 ll modpower(ll x, ll y, ll p) 
{ 
    ll res = 1;      // Initialize result 
  
    x = x % p;  // Update x if it is more than or  
                // equal to p 
  
    while (y > 0) 
    { 
        // If y is odd, multiply x with result 
        if (y & 1) 
            res = (res*x) % p; 
  
        // y must be even now 
        y = y>>1; // y = y/2 
        x = (x*x) % p;   
    } 
    return res; 
} 

ll modInverse(ll a, ll m) 
{ 
 
    return modpower(a, m-2, m); 
 
} 
 
ll max(ll a, ll b){
 
    if(a>b)return a;
    else return b;
}
 
ll min(ll a, ll b){
 
    if(a<b)return a;
    return b;
 
}
 
 
void pairsort(ll a[], ll b[], ll n) 
{ 
    pair<ll, ll> pairt[n]; 
  
 
    for (ll i = 0; i < n; i++)  
    { 
        pairt[i].first = a[i]; 
        pairt[i].second = b[i]; 
    } 
  
    sort(pairt, pairt + n); 
      
    for (ll i = 0; i < n; i++)  
    { 
        a[i] = pairt[i].first; 
        b[i] = pairt[i].second; 
    } 
}
 
ll extendedGcd(ll a, ll b, ll & x, ll & y) {
    if (a == 0) {
        x = 0;
        y = 1;
        return b;
    }
    ll x1, y1;
    ll d = extendedGcd(b % a, a, x1, y1);
    x = y1 - (b / a) * x1;
    y = x1;
    return d;
}



int main()
{ 
ani;
    
        ll n,k;
        cin>>n>>k;

        ll current[k+1];
         rep(i,0,k+1)
         current[i]=0;

        ll ans=0;
        rep(i,1,k+1)
        {
           ll temp=0;
            if(i==1)
              {
                 current[i]=1;
              } 
            else
             {
                for(ll j=1; j<=sqrt(i); j++)
                {
                    if(i%j==0)
                    {
                         temp+=current[j];
                        if(j!=i/j)
                         temp+=current[i/j];
                    }
                }

                current[i]=i-temp;
            }
            ans=modsum(ans, modmul(i-temp, modpower(k/i, n, 1000000007), 1000000007), 1000000007);
        }

        cout<<ans<<endl;


    














return 0;
}

Measured memory_bytes: 4364