1799 二分答案

2021-08-03 23:40:11 字數 922 閱讀 7429

lyk最近在研究二分答案類的問題。

對於乙個有n個互不相同的數且從小到大的正整數數列a(其中最大值不超過n),若要找乙個在a中出現過的數字m,乙個正確的二分程式是這樣子的:

l=1; r=n; mid=(l+r)/2;

while (l<=r)

最終a[r]一定等於m。

但是這個和諧的程式被熊孩子打亂了。

熊孩子在一開始就將a陣列打亂順序。(共有n!種可能)

lyk想知道最終r=k的期望。

由於小數點非常麻煩,所以你只需輸出將答案乘以n!後對1000000007取模就可以了。

在樣例中,共有2個數,被熊孩子打亂後的數列共有兩種可能(1,2)或者(2,1),其中(1,2)經過上述操作後r=1,(2,1)經過上述操作後r=0。r=k的期望為0.5,0.5*2!=1,所以輸出1。

input

3個整數n,m,k(1<=m<=n<=10^9,0<=k<=n)。
output

一行表示答案
input示例

2 1 1
output示例

1#include using namespace std;

typedef long long ll;

const ll limit = 1e7;

const ll mod = 1e9+7;

ll fac = ;

ll fun(ll n)

return result;

}int main()

else

mid = (l+r)/2;

}ll res = 1;

for (ll i = 0; i < rcnt; ++i)

for (ll i = 0; i < lcnt; ++i)

cout << res*fun(n-lcnt-rcnt)%mod <

51Nod1799 二分答案

lyk最近在研究二分答案類的問題。對於乙個有n個互不相同的數且從小到大的正整數數列a 其中最大值不超過n 若要找乙個在a中出現過的數字m,乙個正確的二分程式是這樣子的 l 1 r n mid l r 2 while l r 最終a r 一定等於m。但是這個和諧的程式被熊孩子打亂了。熊孩子在一開始就將...

51nod1799 二分答案 分塊打表

分析 要走到乙個位置的話一共要往左或者往右走o logn 次,而且每一步都必須走對。因為對於題目中給出的 無論k是什麼樣的數,二分過程的次數都是固定的。每走一步只和ami d 的大小關係有關,因此有一些位置只能放 m 或者 m的數,其他 位置可以隨便放。階乘可 以分段打表。includeusing ...

二分查詢與二分答案

主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...