太奇妙了
f [i] 表示已经买了 i 种 , 买到 n 种的期望购买次数
f [i] = f [i+1] + n / ( n - i )
g [i] 表示已经买了 i 种 的期望 出的钱
g [i] = ( f [i] * i + ( g [ i + 1 ] + f [ i + 1 ] ) * ( n - i ) + n ) / ( n - i )
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e4 + 10 ;
double f [N] , g [N] ;
int main () {
double n ;
scanf ( "%lf" , & n ) ;
for ( int i = n - 1 ; i >= 0 ; -- i ) {
f [i] = f [ i + 1 ] + 1.0 * n / ( n - i ) ;
g [i] = 1.0 * ( f [i] * i + ( g [ i + 1 ] + f [ i + 1 ] ) * ( n - i ) + n ) / ( n - i ) ;
}
printf ( "%.2f" , g [0] ) ;
return 0 ;
}