#include<iostream>
#include<vector>
using namespace std;
int main(){
//dp[i][j]表示的含义是前i个整数,以j结尾的时候,有多少喜欢的数列
//转义方程dp[i][j] = sum(dp[i-1][1,2,3,...,k]) - sum(dp[i-1][x], x > j and x % j == 0)
// 当新增加固定一个数的时候,这个新串的种类数,就是不增加这一位时所有喜欢数列种类之和, 再减去前一位中不满足(A <= B)或(A mod B != 0)这条性质的串
const int num = 1000000007;
int n, k;
cin>>n>>k;
vector<vector<int>> dp(n+1, vector<int>(k+1, 0));
dp[0][1] = 1;
for (int i = 1; i <=n; i++){
//sum(dp[i][1,2,3,...,k])
int sum = 0;
for (int j = 1; j <=k; j++){
sum += dp[i-1][j];
sum %= num;
}
for (int x = 1; x <=k; x++){
//sum(dp[i-1][y], y > x and y % x == 0 )
int one_sum = 0;
for (int y = x+x; y <=k; y += x){
one_sum += dp[i-1][y];
one_sum %= num;
}
dp[i][x] = (sum - one_sum + num) % num; // i 个x这种情况·
//cout<<i<<" "<<x<<" "<< sum <<" "<< one_sum<<" " << dp[i][x]<<endl;
}
}
int result = 0;
for (int i = 1; i <= k; i++){
result += dp[n][i];
result %= num;
}
cout<<result<<endl;
}