JZOJ 5244. 【NOIP2017模拟8.8A组】Daydreamin ' (daydream)
Description
worldwideD最近有午睡的習慣~某日中午,他做了一個夢:夢見有一個怪人,她去一個島上住N+1天(編號為0到N)。這是在大洋中的島,每天要么是晴天,要么刮臺風。她到達島的第0天是晴天(這樣她才能上岸)。然后對于第i天,假如是晴天,那么有P(0<P≤1)的幾率會變天:接下來連續(xù)M天都刮臺風,然后第i+M+1天必然會轉(zhuǎn)晴。天氣對她的心情會有影響,用一個值來描述她每一天的心情:如果第i天是晴天,那么這個值為A;如果是雨天,那么島上有D(0<D≤1)的幾率會發(fā)生殺人案件,如果沒發(fā)生殺人案件,這個值為B,否則為C。worldwideD醒來了,他想知道編號1到N天的心情值之和的期望值。Input
一行7個整數(shù)N,M,P,D,A,B,C,如題目所描述(其中給出的P,D是模998244353意義下的值)Output
一個整數(shù),為答案。Sample Input
Sample Input1
3 1 499122177 499122177 1 2 3
Sample Input2
233 23 372752072 54252411 10 20 22
Sample Output
Sample Output1
311951365
Sample Output2
651727164
Data Constraint
30%:N≤20
50%:N≤2,000
100%:1≤M≤N≤1,000,000 1≤A,B,C≤1,000 1≤P,D<998244353
Hint
樣例一輸出的值對應(yīng)的實數(shù)是4.6875
Solution
解決這道題如果直接計算總期望值的話,將會有些困難。
于是我們轉(zhuǎn)而先計算概率。設(shè) F[i] 表示 第 i 天是晴天的概率。
考慮第 i?1 天的天氣,如果是晴天,那么則有:
F[i]+=F[i?1]?(1?P)。-
如果是臺風天,說明第 i?1 天是連續(xù)臺風天的第 m 天,則第 i?m?1 天必然是上一個晴天。
則有:
F[i]+=F[i?m?1]?P初始化是:F[0]=1(第 0 天必定是晴天),于是就可以 O(N) 求出概率了。
接著計算總期望,討論第 i 天的情況:
①:是晴天,則期望為: F[i]?A ;
②:是臺風天,則期望為: (1?F[i])?(C?D+B?(1?D)) (殺人案件的期望);
那么把這 N 天的①②兩種期望全部相加即為答案,時間復(fù)雜度為 O(N) 。
注意:所給的概率都是模意義下的,設(shè)給定的模數(shù)為 Mo ,處理時都應(yīng)模 Mo 。
若給的概率在模意義下為 x ,則概率 1?x 就等于 Mo+1?x ,證明略。
Code
#include<cstdio> using namespace std; const int mo=998244353; int n,m; long long p,d,a,b,c,ans; long long f[1000001]; int main() {scanf("%d%d%lld%lld%lld%lld%lld",&n,&m,&p,&d,&a,&b,&c);long long k=(c*d%mo+(mo+1-d)*b%mo)%mo;for(int i=f[0]=1,l=mo+1-p;i<=n;i++){f[i]=f[i-1]*l%mo;if(i-m-1>=0) f[i]=(f[i]+f[i-m-1]*p)%mo;ans=(ans+f[i]*a)%mo;ans=(ans+(mo+1-f[i])*k)%mo;}printf("%lld",ans);return 0; }總結(jié)
以上是生活随笔為你收集整理的JZOJ 5244. 【NOIP2017模拟8.8A组】Daydreamin ' (daydream)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 5236. 【NOIP2017
- 下一篇: [BZOJ1087][SCOI2005]