【期望】彩色圓環(金牌導航 期望-5)
阿新 • • 發佈:2021-01-22
彩色圓環
金牌導航 期望-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 1⩽N⩽200,1⩽M⩽109
解題思路
先預處理出出現連續x個相同數字的概率,記為prob
然後設f_{i,1/0}為前i個數中,第i個數和式子首尾相接的數相同/不同的期望值
那麼有
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;
}