答案在下面
2026-01-18 11:33:09
发布于:浙江
?
?
??
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
真有?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
加油
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int MAXR = 1e7 + 5;
ll fact[MAXR], sumfact[MAXR];
bool is_key[MAXR];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int l, r;
cin >> l >> r;
int n = r - l + 1;
// 特殊处理 l=1 的情况
if (l == 1) {
fact[0] = 1;
for (int i = 1; i <= n; i++) {
fact[i] = fact[i - 1] * i % MOD;
}
ll ans = fact[n] * (n + 1) % MOD;
// 除以2需要求逆元
ans = ans * ((MOD + 1) / 2) % MOD;
cout << ans << "\n";
return 0;
}
// 初始化所有数为关键数
for (int i = 0; i < n; i++) {
is_key[i] = true;
}
// 标记非关键数
// 对于每个 i 在 [l, r] 中,标记它的倍数(大于 i)为非关键数
for (int i = l; i <= r; i++) {
// 从 2*i 开始
for (ll j = 2LL * i; j <= r; j += i) {
if (j >= l) {
is_key[j - l] = false;
}
}
}
// 统计关键数个数 m
int m = 0;
for (int i = 0; i < n; i++) {
if (is_key[i]) m++;
}
// 预处理阶乘和阶乘前缀和
fact[0] = 1;
sumfact[0] = 0;
for (int i = 1; i <= n; i++) {
fact[i] = fact[i - 1] * i % MOD;
sumfact[i] = (sumfact[i - 1] + fact[i]) % MOD;
}
// 计算答案
ll ans = 0;
if (m == 0) {
ans = 0;
} else {
ans = (ll)m * fact[n - m] % MOD;
ll sum = (sumfact[n] - sumfact[m - 1] + MOD) % MOD;
ans = ans * sum % MOD;
}
cout << ans << "\n";
return 0;
}
这里空空如也







有帮助,赞一个