題目鏈結
首先特判掉\(p=0/1\)的情況...
先考慮如果\(k=1\)怎麼做到\(n^2\)的時間複雜度
設\(f[i]\)表示有\(i\)個人,\(k=1\)的時候倖存的概率
設\(g[i][j]\)表示\(i\)個人每個人挨一下恰好死\(j\)個人的概率
我們就可以列出轉移方程:
\[f[i]=(1-p)\sum_^+f[i]*g[i][0]
\]把含有\(f[i]\)的項全部移到左邊,化簡得:
\[f[i]=\frac^}
\]於是我們就可以愉快地\(dp\)啦
陣列\(g\)存不下來,\(dp\)的時候動態更新就好啦
如果\(k!=1\)怎麼辦呢?
我們可以把\(1\sim k-1\)的這些人先打一遍,對於每種剩下的人數分別計算答案,然後按照概率加起來就好了
\(double\)運算常數很大,比賽時一直\(tle\)在\(65\)分,關於這個常數的問題有兩種解決方法:
看了看排行榜,好像有\(o(n)\)的做法?
#include#include#include#include#include#include#include#include#include#define qmax(x,y) (x=max(x,y))
#define qmin(x,y) (x=min(x,y))
#define mp(x,y) make_pair(x,y)
using namespace std;
typedef long long ll;
typedef pairpii;
inline int read()
while(ch>='0'&&ch<='9')
ans=ans*10+ch-'0',ch=getchar();
return ans*fh;
}const ll maxn=1e4+100,w=2e9;
int n,k;
ll p,g[maxn],f[maxn],pp[maxn];
double php;
int main()
p=php*w;
int x=k-1;
f[1]=1*w,g[0]=w-p,g[1]=p;
if(x==1)
for(int j=0;j<=n;j++)
pp[j]=g[j];
for(int i=2;i<=n;i++)
for(;j;j--) g[j]=(g[j-1]*p+g[j]*(w-p))/w;
(g[0]*=w-p)/=w;
if(i==x)
for(int j=0;j<=n;j++)
pp[j]=g[j];
(f[i]*=w)/=w-g[0];
} if(x==0)
double ans=0;
for(int i=0;i<=x;i++)
printf("%.12lf\n",ans*1.0/w);
return 0;
}
LNOI2014 LCA 解題報告
對於一棵 n 個節點的樹,給出 m 次詢問,每次給出 l,r,x 求 sum limits r depth lca i,x n,m le 5 times 10 4 1 le l le r le n x le n 一道不錯的題目。說明有時候用一些其他的做法求乙個簡單的東西也可以幫助思考。對於我,求lc...
九省LNOI2018退役記
立個flag不會退役。day 0 水一發。大連大學的鍵盤敲起來就跟敲紙似的。膜拜要進隊的gqh,yxd,sjq。都進啦2333 高斯消元,高原反應,分麾下治 給我這只弱雞燒根香。今天晚上爭取把板子敲完。day 1 拿到題的一瞬間是mengbi的。t1暴力出奇蹟?t2很 妙?t3不可做,恩。然後寫了一...
物件導向部分 201
小夥伴們,還在為不知道怎麼下手而頭疼嗎,我們程式競賽協會來幫你們啦 啦啦啦。另外,如果有對程式設計含有濃厚興趣的同學,我們隨時歡迎你們的加入喲 策劃 譚兆飛 程式設計 管懷文 協助 一號人員要求給她打碼 乾脆二號也打碼好了o o 其實只是提供了題目啦 物件導向部分 201 include inclu...