代码一:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=5005;
double dp[N][N];
int main()
{
int n,s;
cin>>n>>s;
int y=s-n-n,x=n-y;
// printf("%.7lf\n",1.0*(2*y+1)*x/(x+y));
for(int i=0;i<=x;++i)
{
for(int j=0;j<=y;++j)
{
if(i==0) dp[i][j]=0;
else if(j==0) dp[i][j]=1;
else dp[i][j]=(dp[i][j-1]*j+dp[i-1][j]*i+2.0*i*j/(i+j-1))/(i+j);
}
}
printf("%.7lf\n",dp[x][y]);
return 0;
代码二:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <queue>
#include <vector>
#include <map>
#define pb push_back
#define mp make_pair
#define eps 1e-9
#define zero(x) (fabs(x)<eps)
#define pi acos(-1.0)
#define f1 first
#define f2 second
const int inf=0x3f3f3f3f;
const long long INF=1LL<<50;
using namespace std;
typedef long long LL;
typedef pair <int,double> PII;
#define N 5002
double f[2][N][2];
int n,s,no,ye;
//f[n][yes][last]
void doit()
{ ye=s-n*2;
no=n-ye;
//printf("~~%d %d\n",no,ye);
memset(f,0,sizeof(f));
f[0][0][1]=1;
double ans=0;
for (int i=0;i<n;i++)
{int o=i&1;
memset(f[o^1],0,sizeof(f[o^1]));
for (int j=0;j<=ye;j++)
{ double p1,p0;
p1=(ye-j)/double (n-i);
p0=1-p1;
f[o^1][j+1][1]+=f[o][j][1]*p1;
f[o^1][j][0]+=f[o][j][1]*p0; ans+=f[o][j][1]*p0;
f[o^1][j+1][1]+=f[o][j][0]*p1; ans+=f[o][j][0]*p1;
f[o^1][j][0]+=f[o][j][0]*p0;
}
}
printf("%.7lf\n",ans);
}
int main()
{
while (scanf("%d%d",&n,&s)!=EOF) doit();
}