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 1output示例
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...