Analysis
其实吧 出题人已经够友善啦
出题人已经把方程给了 我们尝试写出来
设f(i)为生成i排列的期望次数
f(i)=[(f(i−1)+1)∗n−in]+[(f(i)+1)∗in]
随便化简一下
我们发现 f[i]=f(i−1)+nn−i
这样的时间是 O(n) 的
涨姿势 欧拉常数+ln(i)约等于原式中的调和级数
因为精度不卡
所以说…
Code
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define oo 2139062143
using namespace std;
const double Eule = 0.57721566490153286060651209;
double ans;
long long n;
int main()
{
scanf("%lld", &n);
ans = 0;
if (n <= 10000000)
{
for (long long i = 1;i <= n;i ++)
ans += (double)1 / (double)(i);
}
else
ans = log((double)n) + Eule;
printf("%.0lf", ans * n);
}