- 注意初始化条件
- 注意怎么算排列数的
- 注意 int 溢出
- 就按题目说的,每个位置应该是什么,找出有多少个符合条件的,A(所有大于x的,需要大的位置数),A(所有小于x的,需要大的位置数),A(剩下的,剩下的),乘起来就行了。
private static final int MOD = (int) (1e9 + 7);
public static void solve(Kattio kattio) {
int n = kattio.nextInt();
int x = kattio.nextInt();
int pos = kattio.nextInt();
int greater = n - x;
int smaller = x - 1;
int g = 0;
int s = 0;
int l = 0;
int r = n;
while (l < r) {
int mid = l + (r - l) / 2;
if (mid <= pos) {
s++;
l = mid + 1;
} else {
g++;
r = mid;
}
}
s--;
long res = A(smaller, s) * A(greater, g) % MOD * A(n - s - g - 1, n - s - g - 1) % MOD;
kattio.println(res);
}
public static long A(int n, int m) {
if (m > n) {
return 0;
}
long res = 1;
for (int i = 0; i < m; i++) {
res = res * n % MOD;
n--;
}
return res;
}