将n封信放入n个信封,每一封信对应一个特定的信封,那么如果n封信全部放错的组合有多少种
当n个元素放入n个特定位置,我们用s[n]来表示n封信放入n个位置,s[n-1]表示n-1封信放入n-1个位置,我们假设将第n封信放入第k个位置,那么总共有n-1个选择,接着对于n位置我们有两种情况
1.如果将第k封信放入第n个位置,即n和k互相放反了,那么对于全局来说,我们只剩下n-2封信了,即s[n-2]
2.如果第k封信不放入第n个位置,即我们还有n-1个元素没有放,我们有s[n-1]种方法
故总共方程可列出s[n]=(n-1)*(s[n-1]+s[n-2])边界s[1]=0;s[2]=1;
这题目纯粹是掌握公式,学会更多的东西
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
long long s[1009];
int main()
{
s[0]=0;
s[1]=0;//没有错排可能
s[2]=1;
int i,n;
for(i=3;i<=1000;i++)
{
s[i]=(i-1)*(s[i-1]+s[i-2]);
}
scanf("%d",&n);
printf("%lld",s[n]);
}