這是個有序的序列,只要計算一個數出現了最多次,最後乘 就好了。
枚舉出現了 次。
那剩下的就是
枚舉兩邊的冪指數,是個調和級數。複雜度
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1000000007;
const int N = 202020;
typedef long long ll;
int fac[N], ifac[N];
int n, lo, hi, test, ans;
inline void pre(int n) {
ifac[1] = 1;
for (int i = 2; i <= n; i++)
ifac[i] = (ll)(MOD - MOD / i) * ifac[MOD % i] % MOD;
fac[0] = ifac[0] = 1;
for (int i = 1; i <= n; i++) {
fac[i] = (ll)fac[i - 1] * i % MOD;
ifac[i] = (ll)ifac[i - 1] * ifac[i] % MOD;
}
}
inline int C(int n, int m) {
if (n < 0 && m >= 0)
return (m & 1) ? MOD - C(-n + m - 1, m) : C(-n + m - 1, m);
if (n < m) return 0;
return (ll)fac[n] * ifac[m] % MOD * ifac[n - m] % MOD;
}
inline void add(int &x, int a) {
x += a; while (x >= MOD) x -= MOD;
}
inline int pow(int a, int b) {
int c = 1;
while (b) {
if (b & 1) c = (ll)c * a % MOD;
b >>= 1; a = (ll)a * a % MOD;
}
return c;
}
inline int inv(int x) {
return pow(x, MOD - 2);
}
int main(void) {
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
cin >> test; pre(200000);
while (test--) {
cin >> n >> lo >> hi;
int m = hi - lo + 1;
ans = 0;
for (int k = 1; k <= n; k++)
for (int j = 0; n - k - j >= 0 && j / k <= m - 1; j += k) {
int up = C(m - 1, j / k);
if ((j / k) & 1) up = MOD - up;
int down = C(m + n - k - j - 2, n - k - j);
add(ans, (ll)up * down % MOD);
}
ans = (ll)ans * m % MOD;
cout << ans << endl;
}
return 0;
}