1. 程式人生 > 其它 >【期望】彩色圓環(金牌導航 期望-5)

【期望】彩色圓環(金牌導航 期望-5)

技術標籤:期望金牌導航期望

彩色圓環

金牌導航 期望-5

題目大意

給你一個環,每個位置的數字等概率為1~m中的其中一個,對於連續的相同數字的串,記其長度為 a i a_i ai,求 a i a_i ai的積的期望值

輸入樣例

8 1

輸出樣例

8.00000

資料範圍

1 ⩽ N ⩽ 200 , 1 ⩽ M ⩽ 1 0 9 1\leqslant N \leqslant 200,1\leqslant M \leqslant 10^9 1N200,1M109

解題思路

先預處理出出現連續x個相同數字的概率,記為prob
然後設f_{i,1/0}為前i個數中,第i個數和式子首尾相接的數相同/不同的期望值
那麼有

f i , 0 + = f j − 1 , 0 × p r o b i − j + 1 × ( i − j + 1 ) × m − 2 m f i , 0 + = f j − 1 , 1 × p r o b i − j + 1 × ( i − j + 1 ) × m − 1 m f i , 1 + = f j − 1 , 0 × p r o b i − j + 1 × ( i − j + 1 ) × 1 m \begin{aligned}f_{i,0} &+= f_{j - 1,0} \times prob_{i - j + 1} \times (i - j + 1) \times \frac{m-2}{m}\\f_{i,0} &+= f_{j - 1,1} \times prob_{i - j + 1} \times (i - j + 1) \times \frac{m-1}{m}\\f_{i,1} &+= f_{j - 1,0} \times prob_{i - j + 1} \times (i - j + 1) \times \frac{1}{m}\end{aligned}
fi,0fi,0fi,1+=fj1,0×probij+1×(ij+1)×mm2+=fj1,1×probij+1×(ij+1)×mm1+=fj1,0×probij+1×(ij+1)×m1

i-j+1為貢獻值
第一行是既要不等於上一個又不等於收尾相接的
第二行是既要不等於上一個即可(因為首尾相接的和上一個相等)
第三行要和首尾相接的相等
最後處理一下首尾相接部分即可(詳情見程式碼)

程式碼

#include<cstdio>
#include
<cstring>
#include<iostream> #include<algorithm> #define ll long long using namespace std; int n; double m, ans, prob[210], f[210][2]; int main() { scanf("%d%lf", &n, &m); prob[1] = 1; f[0][1] = 1; for (int i = 2; i <= n; ++i) prob[i] = prob[i - 1] / m;//求概率 for (int i = 1; i <= n; ++i) for(int j = 1; j <= i; ++j) { f[i][0] += f[j - 1][0] * prob[i - j + 1] * (i - j + 1) * (m - 2) / m; f[i][0] += f[j - 1][1] * prob[i - j + 1] * (i - j + 1) * (m - 1) / m; f[i][1] += f[j - 1][0] * prob[i - j + 1] * (i - j + 1) / m; } ans = n * prob[n]; for (int i = 1; i < n; ++i) ans += f[i][0] * prob[n - i] * (n - i) * (n - i);//首尾相接的,以保證不相等,不用除,第一個(n-i)為貢獻,第二個為把最後面的移到前面的方案數 printf("%.5lf", ans); return 0; }