首先記錄ai
,ja i,
j表示單位
i i
生命值為
j' role="presentation" style="position: relative;">j
j的概率,那麼每次修改可以o(
m)o (m
)。
對於詢問,先求出ex
i=∑m
ij=1
ai,j
e xi
=∑j=
1mia
i,
j表示單位
i i
存活的概率。那麼我們只要對於每乙個單位
i' role="presentation" style="position: relative;">i
i,求出除了該單位的剩下k−
1 k−1
個單位中,有
1..k−1
1..k−1
個單位的存活的概率就解決了。 設f
i,j fi,
j表示考慮前
i i
個單位,其中
j' role="presentation" style="position: relative;">j
j個單位存活的概率,轉移一輪是o(
n2) o(n
2)
的,因為對於每個單位都要轉移一輪,所以是o(
n3) o(n
3)
。 因為每輪轉移都只有自己沒有參與轉移,考慮如何從01揹包中刪除乙個元素。
新增乙個元素f′
k=fk
−1⋅e
xi+f
k⋅(1
−exi
) fk′
=fk−
1⋅ex
i+fk
⋅(1−
exi)
。 那麼刪除乙個元素就是fk
=f′k
−fk−
1∗ex
i1−e
xif k=
fk′−
fk−1
∗exi
1−ex
i。
只需要先把所有的轉移一遍,再分別刪除每乙個即可。注意處理ex
i=1 exi
=1
的情況,總複雜度o(
qm+c
n2) o(q
m+cn
2)
。 **:
#include
#include
#include
#include
#define n 210
#define m 110
#define ll long long
using namespace std;
const int mod=998244353;
int n,c[n],q,t[n];
ll a[n][m],f[n][n],g[n],ex[n],ans[n],inv[n];
ll ksm(ll a,ll b)return r;}
intread()
int main()
for(int j=1;j<=m;j++)
ans[i]=(ans[i]+ex[i]*g[j-1]%mod
*inv[j])%mod;
} for(int i=1;i<=m;i++)
printf("%lld ",ans[i]);
puts("");
}else
}for(int i=1;i<=n;i++)
ans[i]=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=c[i];j++)
ans[i]=(ans[i]+a[i][j]*j)%mod;
for(int i=1;i<=n;i++)
printf("%lld ",ans[i]);
puts("");
return
0;}
CTSC2018 假面 期望 DP
loj 2552 luogu p4564 考場上這道題我先是寫了個70分暴力,然後發現似乎可以ntt,然鵝問題是 我沒學過ntt,遂腦補之,腦補出來了,下午出成績一看,卡成暴力分 70 同是 o qk 2 log k 學姐的拉格朗日什麼玩意就能過tat 學姐太強了 遂不忿,今天上午重寫ntt,努力卡...
01揹包(多個揹包的組合)
kkksc03的大學生活非常的頹廢,平時根本不學習。但是,臨近期末考試,他必須要開始抱佛腳,以求不掛科。這次期末考試,kkksc03需要考4科。因此要開始刷習題集,每科都有乙個習題集,分別有s1,s2,s3,s4道題目,完成每道題目需要一些時間,可能不等 a1.as1,b1.bs2,c1.cs3,d...
常見的揹包問題 01揹包和完全揹包
有 n 件物品和容量為 m 的揹包,給出 n 件物品的重量 w i 以及價值 c i 求解讓裝入揹包的物品重量不超過揹包容量且價值最大,每個物品只能選擇一次 暴力解法 暴力列舉每件物品要不要放入揹包,時間複雜度o 2 n 顯然是不能接受的,而使用 dp 可以將時間複雜度變成o nm 動態規劃 用dp...