http://lx.lanqiao.cn/problem.page?gpid=T259
这就是概率DP吧。
#include <bits/stdc++.h>
using namespace std;
const int maxn=105;
const int INF=0x3f3f3f3f;
int n,a,b,x;
double dp[maxn][5005];
//取i个数时和为j的概率
int main(){
cin >> n >> a >> b >> x;
double ans;
int sum=b-a+1;
dp[0][0]=1; //取0次,和为0的概率为1,这行在概率DP中还蛮重要的。
for (int i=1;i<=n;i++){ //取i个数
for (int j=0;j<=x;j++){ //总和为j
for (int t=a;t<=b&&t<=j;t++){
dp[i][j]+=dp[i-1][j-t]/sum; //或者可以理解成在原来的概率上再*1/sum
}
}
}
printf("%.4lf",dp[n][x]);
}