问答对一半的方案数,也就是k个错,n-k个对,k从0到n/2枚举,然后k个错的就用错排公式,然后还要乘上从n个人中选出k个错的的组合数 ,两个都可以打表出来

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=30;
typedef long long ll;
ll a[N],c[N][N];
void init(){
   
    a[0]=1;
    a[1]=0;
    for(int i=2;i<N;i++){
   
        a[i]=(i-1)*(a[i-1]+a[i-2]);
    }
    c[0][0]=1;
    for(int i=1;i<N;i++){
   
        c[i][0]=c[i][i]=1;
        for(int j=1;j<i;j++){
   
            c[i][j]=c[i-1][j-1]+c[i-1][j];
        }
    }
}
int main(void){
   
    init();
    int n;
    while(~scanf("%d",&n) && n){
   
        ll ans=0;
        for(int i=0;i<=n/2;i++){
   
            ans+=c[n][i]*a[i];
        }
        printf("%lld\n",ans);
    }
    return 0;
}