#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; }