前题
ZYCdalaoZYCdalaoZYCdalao让我推这题,然后我只推出了fff的推导,我还是太菜了QVQQVQQVQ
正题
题目链接:https://www.luogu.org/problemnew/show/P4550
题目大意
nnn种,每次随机买一个邮票(每种的概率均等),然后第kkk种要kkk元,求收集完所有邮票需要的期望钱数。
解题思路
首先设gig_igi表示购买iii个邮票,买完剩下的邮票需要的期望钱数,我们发现因为有kkk,我们很难计算答案,但我们可以将费用推后计算。先设fif_ifi表示拿到了iii个,要取完剩下的邮票需要购买的期望次数(倒推),那么有n−in\frac{n-i}{n}nn−i的概率买到正确的邮票,有in\frac{i}{n}ni的概率买到之前买过的邮票
fi=n−in∗fi+1+in∗fi+1f_i=\frac{n-i}{n}*f_{i+1}+\frac{i}{n}*f_i+1fi=nn−i∗fi+1+ni∗fi+1
fi=n−in∗fi+1+in∗fi+1f_i=\frac{n-i}{n}*f_{i+1}+\frac{i}{n}*f_i+1fi=nn−i∗fi+1+ni∗fi+1
n−in∗fi=n−in∗fi+1\frac{n-i}{n}*f_i=\frac{n-i}{n}*f_i+1nn−i∗fi=nn−i∗fi+1
fi=fi+1+nn−if_i=f_{i+1}+\frac{n}{n-i}fi=fi+1+n−in
然后我们考虑如何推导gig_igi,我们每次有in\frac{i}{n}ni的概率买到已经有了的,有n−in\frac{n-i}{n}nn−i的概率买到没有的,因为费用推后计算,所以每次后面取到的费用都会+1+1+1,所以现在的费用就是之前的购买次数加上原来的费用fi+1f_{i}+1fi+1,那么加上前面的购买费用就是gi+fi+1g_i+f_i+1gi+fi+1
那么推导
gi=in(gi+fi)+n−in(gi+1+fi+1)+1g_i=\frac{i}{n}(g_i+f_i)+\frac{n-i}{n}(g_{i+1}+f_{i+1})+1gi=ni(gi+fi)+nn−i(gi+1+fi+1)+1
gi=in∗gi+in∗fi+n−in(gi+1+fi+1)+1g_i=\frac{i}{n}*g_i+\frac{i}{n}*f_i+\frac{n-i}{n}(g_{i+1}+f_{i+1})+1gi=ni∗gi+ni∗fi+nn−i(gi+1+fi+1)+1
n−ingi=in∗fi+n−in(gi+1+fi+1)\frac{n-i}{n}g_i=\frac{i}{n}*f_i+\frac{n-i}{n}(g_{i+1}+f_{i+1})nn−igi=ni∗fi+nn−i(gi+1+fi+1)
gi=in−i∗fi+gi+1+fi+1+1g_i=\frac{i}{n-i}*f_i+g_{i+1}+f_{i+1}+1gi=n−ii∗fi+gi+1+fi+1+1
overoverover
codecodecode
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=11000;
double n;
double f[N],g[N];
int main()
{scanf("%lf",&n);for(int i=n-1;i>=0;i--){f[i]=f[i+1]+(double)n/(n-i);g[i]=(double)(f[i]+1)*i/(n-i)+g[i+1]+f[i+1]+1;}printf("%.2lf",g[0]);
}