由期望的线性性
可以一个个加起来
所以x^3 x^2 K分开考虑
x^2 x^3详见BZOJ 4318: OSU! 期望dp
我们来讨论一下K
每次的状态可以看做是一个01串
对于每次K的变化一定是在0结束或1结束
所以每次都可以抵消掉
不过当然有例外
当第一个和最后一个相同,就会无法抵消
所以只需要把这种情况加上就行了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
int N;
double K,p[1000010],l1[1000010],l2[1000010],n1[1000010],f[1000010][2],ans;
int main()
{
register int i,j;
scanf("%d%lf",&N,&K);
for(int i=1;i<=N;i++)
{
scanf("%lf",&p[i]);
l1[i]=(l1[i-1]+1)*p[i];
n1[i]=(n1[i-1]+1)*(1-p[i]);
l2[i]=(l2[i-1]+2*l1[i-1]+1)*p[i];
f[i][1]=f[i-1][1]+(3*l2[i-1]+3*l1[i-1]+1)*p[i];
f[i][2]=f[i-1][2]-(2*n1[i-1]+1)*(1-p[i]);
}
ans+=f[N][1]+f[N][2];
ans=ans+p[1]*p[N]*K-(1-p[1])*(1-p[N])*K;
printf("%lf\n",ans);
return 0;
}