日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P4457


題目大意

開始一個人最大生命值為nnn,剩余hphphp點生命,然后每個時刻如果生命值沒有滿那么有1m+1\frac{1}{m+1}m+11?的概率回復一點生命,然后敵人攻擊kkk次,每次有1m+1\frac{1}{m+1}m+11?概率造成一點傷害。

求期望多少次后生命值降到000或以下。

1≤T≤100,1≤n≤1500,1≤m,k≤1091\leq T\leq 100,1\leq n\leq 1500,1\leq m,k\leq 10^91T100,1n1500,1m,k109


解題思路

dpdpdp方程還是很好推的,設pip_ipi?表示在敵人攻擊時受到iii點傷害的概率,那么就是
pi=(1m+1)i(mm+1)k?i(ki)p_i=(\frac{1}{m+1})^i(\frac{m}{m+1})^{k-i}\binom{k}{i}pi?=(m+11?)i(m+1m?)k?i(ik?)
的概率,這個iii只需要計算到nnn就好了。

然后設fif_ifi?表示剩余iii點生命時期望還需要打多久
然后枚舉一個jjj表示本回合受到的傷害,分成回復了生命或者沒有回復生命兩種情況,方程就是
fi=1m+1(∑j=0ipjfi?j+1)+mm+1(∑j=0i?1pjfi?j+1)f_i=\frac{1}{m+1}(\sum_{j=0}^{i}p_jf_{i-j+1})+\frac{m}{m+1}(\sum_{j=0}^{i-1}p_jf_{i-j}+1)fi?=m+11?(j=0i?pj?fi?j+1?)+m+1m?(j=0i?1?pj?fi?j?+1)
當然fnf_nfn?需要特殊處理
fn=∑i=0npifn?i+1f_n=\sum_{i=0}^np_if_{n-i}+1fn?=i=0n?pi?fn?i?+1
發現這個方程是有前有后的環狀轉移,但是暴力高斯消元O(n3)O(n^3)O(n3)的時間復雜度接受不了。

不難發現的是我們現在的方程矩陣其實就是一個下三角矩陣再往右擴一列。我們可以先O(n2)O(n^2)O(n2)把這個下三角消成對角線然后第iii列就只有iiii+1i+1i+1兩個系數了,反過來再消一次就好了。

時間復雜度O(Tn2)O(Tn^2)O(Tn2)


code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1600,P=1e9+7; ll T,n,hp,m,k,a[N][N],b[N]; ll inv[N],p[N]; ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans; } ll C(ll n,ll m){ll ans=1;for(ll i=n-m+1;i<=n;i++)ans=ans*i%P;return ans*inv[m]%P; } signed main() {inv[1]=1;for(ll i=2;i<N;i++)inv[i]=P-(P/i)*inv[P%i]%P;inv[0]=1;for(ll i=1;i<N;i++)inv[i]=inv[i-1]*inv[i]%P;scanf("%lld",&T);while(T--){scanf("%lld%lld%lld%lld",&n,&hp,&m,&k);ll invm=power(m+1,P-2);if(!k||k==1&&!m){puts("-1");continue;}else if(!m){ll ans=0;while(hp>0){if(hp<n)hp++;hp-=k;ans++;}printf("%lld\n",ans);continue;}ll tmp=power(invm,k);for(ll i=0;i<=min(k,n);i++)p[i]=tmp*power(m,k-i)%P*C(k,i)%P;memset(a,0,sizeof(a));memset(b,0,sizeof(b));for(ll i=0;i<=min(k,n-1);i++)a[n][n-i]=P-p[i];a[n][n]++;b[n]++;for(ll i=1;i<n;i++){a[i][i]=1;b[i]=1;for(ll j=0;j<=min(k,i-1);j++)(a[i][i-j]+=P-invm*m%P*p[j]%P)%=P;for(ll j=0;j<=min(k,i);j++)(a[i][i-j+1]+=P-invm*p[j]%P)%=P;}for(ll i=1;i<=n;i++){ll inv=power(a[i][i],P-2);a[i][i]=1;b[i]=b[i]*inv%P;a[i][i+1]=a[i][i+1]*inv%P;for(ll j=i+1;j<=n;j++){ll rate=P-a[j][i];a[j][i]=0;(a[j][i+1]+=a[i][i+1]*rate)%=P;(b[j]+=b[i]*rate)%=P;}}for(ll i=n-1;i>=1;i--){ll rate=P-a[i][i+1];b[i]=(b[i]+rate*b[i+1])%P;}printf("%lld\n",(b[hp]+P)%P);}return 0; }

總結

以上是生活随笔為你收集整理的P4457-[BJOI2018]治疗之雨【期望dp,高斯消元】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。