题意:n个面的骰子,问期望骰多少次可以将所有n个面都骰到
思路:期望dp
状态表示:dp[i]代表已经骰出了i个面,还需要期望骰dp[i]次才能将n个面都骰到
状态转移:对于dp[i]我们考虑两种情况:
1、下次仍然骰到已经骰到的i个面其中一个,则还需要骰dp[i]次,概率为
2、下次骰到了没有骰到过的面,则还需要骰dp[i+1]次,概率为
而这次投掷本身算作一次,所以可得状态转移方程:
将本式化简可得:
Accode:
#include<bits/stdc++.h>
#define endl '\n'
#define INF 0x3f3f3f3f
#define INFF 0x3f3f3f3f3f3f3f3f
#define int long long
#define fix fixed<<setprecision
#define pb push_back
#define Mirai ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef pair<int,int> pii;
const int N=1010;
double dp[N];
int n;
void solve()
{
cin>>n;
dp[n]=0;
for(int i=n-1;i>=0;i--)
{
dp[i]=dp[i+1]+(double)n/(n-i);
}
cout<<dp[0]<<endl;
}
signed main()
{
Mirai;
int T=1;
cout<<fix(2);
cin>>T;
while(T--)
{
solve();
}
}