有\(m+1\)個數,第乙個數為\(p\),每輪:選乙個數\(+1\),再依次選\(k\)個數\(-1\)要求如果第乙個數\(=n\),不能選它\(+1\),如果第乙個數\(=0\),不能選它\(-1\)
如果沒有可選的數,跳過該次選擇
問使得第乙個數\(=0\)的期望步數
\(n\le1500\),\(case\le10\)
設\(f_i\)表示當第乙個數為\(i\)時期望多少輪變為\(0\)\[f_i=1+\sum_^p_f_j,1\le i
其中\(p_\)表示一輪將第乙個數從\(i\)變為\(j\)的概率
對第乙個式子進行移項
\[p_f_=-1-\sum_^f_j+(1-p_)f_i,2\le i \le n
\]問題在於不知道\(f_1\),所以可以先把\(f_1\)設為\(x\),推出\(f_n=a_1x+b_1\)
然後根據第二個式子,得到\(f_n=a_1x+b_2\)
最後解出\(f_1\),求得\(f_p\)
#include#define ll long long
#define dbg1(x) cerr<<#x<<"="<<(x)<<" "
#define dbg2(x) cerr<<#x<<"="<<(x)<<"\n"
#define dbg3(x) cerr<<#x<<"\n"
using namespace std;
#define reg register
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}const int mn=1505,p=1e9+7;
int mul(int x,int y)
int add(int x,int y)
int fp(int x,int y=p-2)
struct d
d operator+(const d&o)const
d operator-(const d&o)const
d operator*(const int o)const
}f[mn],or_;
int n,p,m,k,invm_,invm,a[mn][mn],g[mn],b[mn],inv[mn],x;
int solve()
memset(b,0,sizeof b);memset(a,0,sizeof a);
invm_=fp(m+1);invm=fp(m);b[0]=mul(fp(m,k),fp(invm_,k));
for(i=1;i<=n&&i<=k;++i)b[i]=mul(mul(b[i-1],invm),mul(inv[i],k-i+1));
for(i=1;i
bzoj5292 bjoi2018 治療之雨
題意 你現在有m 1個數 第乙個為p,最小值為0,最大值為n 剩下m個都是無窮,沒有最小值或最大值。你可以進行任意多輪操作,每輪操作如下 在不為最大值的數中等概率隨機選擇乙個 如果沒有則不操作 把它加一 進行k次這個步驟 在不為最小值的數中等概率隨機選擇乙個 如果沒有則不操作 把它減一。現在問期望進...
BJOI2018 求和 倍增LCA
master 對樹上的求和非常感興趣。他生成了一棵有根樹,並且希望多次詢問這棵樹上一段路徑上所有節點深度的 k 次方和,而且每次的 k 可能是不同的。此處節點深度的定義是這個節點到根的路徑上的邊數。他把這個問題交給了 pupil 但 pupil 並不會這麼複雜的操作,你能幫他解決嗎?輸入格式 第一行...
BJOI2018 二進位制
題目鏈結 pupil 發現對於乙個十進位制數,無論怎麼將其的數字重新排列,均不影響其是不是 的倍數。他想研究對於二進位制,是否也有類似的性質。於是他生成了乙個長為n 的二進位制串,希望你對於這個二進位制串的乙個子區間,能求出其有多少位置不同的連續子串,滿足在重新排列後 可包含前導0 是乙個3 的倍數...