比较水的概率DP。
#include<stdio.h>
#include<string.h>
#define N 205
double dp[N],s[N];
int a[1000005];
int main()
{
int n,m,l,r;
while(scanf("%d%d%d%d",&n,&m,&l,&r),n+m+l+r)
{
int i,j;
for(i=1; i<=m; i++)
scanf("%d",&a[i]);
memset(dp,0,sizeof(dp));
memset(s,0,sizeof(s));
dp[1]=1;
s[1]=1;
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
{
if(j>a[i])
dp[j]=s[j-a[i]]*0.5;
else
dp[j]=s[j-a[i]+n]*0.5;
if(j+a[i]<=n)
dp[j]+=s[j+a[i]]*0.5;
else
dp[j]+=s[j+a[i]-n]*0.5;
}
for(j=1; j<=n; j++)
s[j]=dp[j];
}
double sum;
sum=0;
for(i=l; i<=r; i++)
sum+=dp[i];
printf("%.4f\n",sum);
}
return 0;
}