稍微推一下,答案是 ∑ i = 1 k ⌊ n k ⌋ + ∑ i = 1 k ⌊ n − 1 k ⌋ \sum_{i=1}^k\lfloor \frac{n}{k}\rfloor+\sum_{i=1}^k\lfloor \frac{n-1}{k}\rfloor i=1∑k⌊kn⌋+i=1∑k⌊kn−1⌋
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cstdlib>
#include<string.h>
#include<iomanip>
#define ll long long
#define Max(a, b) ((a) > (b) ? (a) : (b))
#define INF 0x3f3f3f3f
#define eps 1e-6
const int mod = 1e9 + 7;
typedef std::pair<int, int> pii;
typedef std::pair<ll, ll> pll;
ll gcd(ll p, ll q) { return q == 0 ? p : gcd(q, p % q); }
using namespace std;
ll n, k;
ll cal(ll n, ll k) {
ll ret = 0;
for (ll l = 1, r; l <= n; l = r + 1) {
r = n / (n / l);
if (r >= k) {
ret = (ret + (k - l + 1) * (n / l)) % mod;
break;
} else {
ret = (ret + (r - l + 1) * (n / l)) % mod;
}
}
return ret % mod;
}
ll f(ll n, ll k) {
ll ret = cal(n, k) + cal(n - 1, k) + k - n;
while (ret < 0)
ret += mod;
return ret % mod;
}
int main() {
cin >> n >> k;
cout << f(n,k) << endl;
/*
for(int i=1;i<=50;i++) dp[1][i]=1;
for(int i=1;i<=50;i++){
for(int j=1;j<=50;j++) {
dp[j + i][i] |= dp[j][i];
dp[j * i][i] |= dp[j][i];
}
}
for(int i=1;i<=50;i++){
for(int j=1;j<=50;j++)
dp[j][i]+=dp[j-1][i];
}
for(int i=1;i<=50;i++){
for(int j=1;j<=50;j++)
dp[i][j]+=dp[i][j-1];
}
for (int i = 1; i <= 50; i++) {
for (int j = 1; j <= 50; j++) {
cout << dp[i][j] << ' ';
if (dp[i][j] != f(i, j)) cout << "WARRR" << endl;
}
cout << endl;
}*/
return 0;
}