【牛客 - 368C】流星雨(概率dp,乘法逆元)
題干:
現在一共有n天,第i天如果有流星雨的話,會有wiwi顆流星雨。
第i天有流星雨的概率是pipi。
如果第一天有流星雨了,那么第二天有流星雨的可能性是p2+Pp2+P,否則是p2p2。相應的,如果第i?1?(i≥2)i?1?(i≥2)天有流星雨,第i天有流星雨的可能性是pi+Ppi+P,否則是pipi。
求n天后,流星雨顆數的期望。
輸入描述:
?第一行三個整數,n,a,b,其中n為天數,P=abP=ab
第二行n個整數wiwi。
接下來n行,每行兩個整數,x,y,第i+2行表示第i天有流星雨的概率pi=xypi=xy。
1≤n≤105,?1≤a,b,x,y,wi≤109,?pi+P≤1.01≤n≤105,?1≤a,b,x,y,wi≤109,?pi+P≤1.0
輸出描述:
?一行一個整數,為答案對109+7109+7?取模的結果。
即設答案化為最簡分式后的形式為abab,其中a和b互質。輸出整數?x 使得bx≡a(mod?109+7)bx≡a(mod?109+7)且0≤x<109+70≤x<109+7??梢宰C明這樣的整數x是唯一的。
?
示例1
輸入
復制
2 1 3 1 1 1 2 1 2輸出
復制
166666669說明
?第一天有流星雨第二天也有流星雨的概率是12×(12+13)12×(12+13),然后乘以流星雨的顆數2
?
第一天有流星雨第二天沒有流星雨的概率是12×1612×16,乘以顆數1
第一天沒有,第二天有的概率12×1212×12,乘以顆數1
第一天沒有,第二天也沒有的概率12×1212×12,乘以顆數0。
所以流星雨顆數的期望是7676
示例2
輸入
復制
3 1 5 1 1 2 1 2 1 4 2 3輸出
復制
763333341解題報告:
dp[i]代表第i天下雨的真正概率。可知,第i天的概率只與第i-1天有關,遞推方程容易求出,最后再乘以權值w[i]。最后輸出模意義下的解。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<ctime> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e5 + 5; ll p[MAX],w[MAX]; ll dp[MAX];//設dp[i]為第i天下雨的真正概率,由于第i天的概率只與第i-1天有關 const ll mod = 1e9+7; ll qpow(ll a,ll k) {ll res = 1;while(k) {if(k&1) res = (res*a)%mod;k>>=1;a = (a*a)%mod;}return res; } int main() {ll n,a,b,x,y;cin>>n>>a>>b;ll P = a*qpow(b,mod-2)%mod;for(int i = 1; i<=n; i++) scanf("%lld",w+i);for(int i = 1; i<=n; i++) {scanf("%lld%lld",&x,&y);p[i] = x*qpow(y,mod-2)%mod;}for(int i = 1; i<=n; i++) {dp[i] = dp[i-1] * (p[i]+P) %mod;dp[i] += (1-dp[i-1]+mod)*p[i]%mod;dp[i] %= mod; }ll ans = 0;for(int i = 1; i<=n; i++) {ans = (ans + dp[i]*w[i]%mod)%mod;}printf("%lld\n",ans);return 0 ; }?
總結
以上是生活随笔為你收集整理的【牛客 - 368C】流星雨(概率dp,乘法逆元)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【牛客 - 303B第十五届浙江大学宁波
- 下一篇: speedmgr.exe - speed