题意:1到n重排,至少有一个在原来位置的概率
思路:结果为1-全错排概率,错排种类数递推式:dp[i]=(i-1)*(dp[i-1]+dp[i-2]),此题的n极大,所以不能正常递推至n,而题目中要求最终结果误差小于1e-6,而通过枚举较小的n可以发现最终结果会趋于一个定值,所以我们只需要在误差小于1e-1之后只输出一个定值就可以了(trick)
ac代码:
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define INF 0x3f3f3f3f
#define pb push_back
#define int long long
#define Mirai ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef pair<int,int> pii;
const int N=110;
int a[N];
int n;
int f(int x)
{
int res=1;
for(int i=2;i<=x;i++)
{
res*=i;
}
return res;
}
void solve()
{
cin>>n;
a[1]=0;
a[2]=1;
for(int i=3;i<=10;i++)a[i]=(i-1)*(a[i-1]+a[i-2]);
if(n<=10)printf("%.6lf",1-((double)a[n]/f(n)));
else cout<<0.632121<<endl;
}
signed main()
{
Mirai;
int T=1;
//cin>>T;
while(T--)
{
solve();
}
}