直接贴出递推公式:
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;
}
如有不当之处欢迎指出!