D. 二分查找

    传统题 1000ms 256MiB

二分查找

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

题目描述

对于一个从 零开始编号 的数组 aa 和一个整数 xx,二分算法查找 xx 的伪代码如下:

可能和常规的二分查找模板不同,可自行模拟体会。

1 BinarySearch(a, x)
2     left = 0
3     right = a.size()
4     while left < right
5         middle = (left + right) / 2
6         if a[middle] <= x then
7             left = middle + 1
8         else
9             right = middle
10    if left > 0 and a[left - 1] == x then
11        return true
12    else 
13        return false

注意,数组的下标是从零开始的。

众所周知该算法只在 数组有序时 才有效。然而,翁老师发现这个说法并不完全正确,因为确实存在一些无序数组,算法依然能找到 xx

因此翁老师想给二分算法的作者写信,但在此之前,他想要考虑长度为 nn 的排列中,算法能够找到 xx 的情况。一个长度为 nn 的排列是指一个包含 11nnnn 个不同整数的数组,顺序任意。

请你帮助 翁老师,计算有多少个长度为 nn 的排列,满足 xx 恰好在下标 pospos 处,且上述二分查找算法能够找到 xx(返回 true)。由于答案可能非常大,请输出对 109+710^9+7 取余的结果。

输入格式

输入仅一行,包含三个整数 nnxxpospos,分别表示排列的长度、要查找的数字以及该数字所在的位置。

输出格式

输出一个整数,表示满足条件的排列数对 109+710^9+7 取余后的结果。

4 1 2
6

样例 1 解释

可以证明这 66 个排列运行上述二分程序都能在 pos=2pos=2 的位置找到 x=1x=1

  • (2,3,1,4)(2, 3, 1, 4)
  • (2,4,1,3)(2, 4, 1, 3)
  • (3,2,1,4)(3, 2, 1, 4)
  • (3,4,1,2)(3, 4, 1, 2)
  • (4,2,1,3)(4, 2, 1, 3)
  • (4,3,1,2)(4, 3, 1, 2)
123 42 24
824071958

提示

数据范围

对于 100%100\% 的数据范围满足:1xn1031 \le x \le n \le 10^30posn10 \le pos \le n-1

本题测试点较多,部分测试点满足:n10n\leq 10x=1x=1x=nx=n

进阶算法周赛 - round11

未参加
状态
已结束
规则
IOI
题目
4
开始于
2026-6-12 18:00
结束于
2026-6-14 21:00
持续时间
51 小时
主持人
参赛人数
15