直接贴出递推公式:
cnt[n]=(i-1)*(cnt[n-1]+cnt[n-2]);
数组保存的是失败的种数
AC代码:
#include<cstdio> const int maxn=21; long long p[maxn],cnt[maxn]; double ans[maxn]; void solve(){ long long w=1; for(int i=1;i<=20;++i){ w*=i; p[i]=w; } cnt[1]=0; cnt[2]=1; ans[1]=100; ans[2]=50; for(int i=3;i<=20;++i){ cnt[i]=(i-1)*(cnt[i-1]+cnt[i-2]); ans[i]=1.0*cnt[i]/p[i]*100; } } int main(){ solve(); int T,n; scanf("%d",&T); while(T--){ scanf("%d",&n); printf("%.2lf%%\n",ans[n]); } return 0; }
如有不当之处欢迎指出!