BJOI2018 治療之雨

2022-07-22 23:21:19 字數 1424 閱讀 4567

有\(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 的倍數...