1 /*定义dp[i][j]作为完成i钟,j个子系统需要的天数,那么很显然dp[i][j]由四种状态转移来
2 p1 = i*j / (n*s)
3 p2 = (n-i)*j / (n*s)
4 p3 = i*(s-j) / (n*s)
5 p4 = (n-i)*(s-j) / (n*s)
6 但是对于 dp[i][j],显然此时的dp[i][j]是0,就无法转移了,
7 此时通过移项的方法,把dp[i][j] 移到左边,就能得出dp[i][j]的转移方程了
8 的状态有四种,*/
9 #include <iostream>
10 #include <queue>
11 #include <cstring>
12 using namespace std;
13 typedef long long ll;
14 const int MAXN=1e5+5;
15 double dp[1005][1005];
16 int main()
17 {
18 int n,s;
19 while(cin>>n>>s)
20 {
21 memset(dp,0,sizeof(dp));
22 for(int i=n;i>=0;i--)
23 {
24 for(int j=s;j>=0;j--)
25 {
26 if(n==i&&j==s) continue;
27 double p=i*1.0/n;double q=j*1.0/s;
28 //cout <<p<<" "<<q<<endl;
29 dp[i][j]=((1-p)*(1-q)*(dp[i+1][j+1])+(1-p)*q*(dp[i+1][j])+p*(1-q)*(dp[i][j+1])+1)/(1-p*q);
30 }
31 }
32 printf("%.4lf\n",dp[0][0]);
33 }
34 return 0;
35 }