![](https://img-blog.csdn.net/20180212203847236?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfNDE1MTMzNTI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
我们设a[i]为方案数,当某个人拿到一本书,而那本书原来的主人并没有拿到他的书,即两人的书并不是恰好交换,则除去这本书,剩下的方案数为a[i-1]。而对于上述情况的相反情况,两人正好交换,则剩下的方案数为a[i-2]。出去某个人,有i-1种选择,则关系式为a[i]=(i-1)*(a[i-1]+a[i-2])
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<stack>
#include<queue>
#include<climits>
#define MAXA 100
using namespace std;
long long a[MAXA]={0,0,1,};
int main()
{
int n;
scanf("%d",&n);
for(int i=3;i<=n;i++)
a[i] = (i-1) * (a[i-1] + a[i-2]);
printf("%lld",a[n]);
}