思路:暴力递推+滚动数组(小建建说的)
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
double dp[2][210];
int n,m,l,r,w;
int main()
{
while(scanf("%d%d%d%d",&n,&m,&l,&r)!=EOF)
{
if(n==0&&m==0&&l==0&&r==0)
break;
for(int i=1;i<=n;i++)
dp[0][i]=0;
dp[0][1]=1;
int now=0;
for(int i=1;i<=m;i++)
{
scanf("%d",&w);
for(int j=1;j<=n;j++)
{
dp[1][j]=0.5*dp[0][(j+w)%n==0?n:(j+w)%n]+0.5*dp[0][(j-w+n)%n==0?n:((j-w+n)%n)];
}
memcpy(dp[0],dp[1],sizeof(dp[1]));
}
double ans=0;
for(int i=l;i<=r;i++)
ans+=dp[0][i];
printf("%.4lf\n",ans);
}
return 0;
}