题目描述
某人写了n封信和n个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。
输入输出格式
输入格式:
一个信封数n(n<=20)
输出格式:
一个整数,代表有多少种情况。
输入输出样例
输入样例#1
2
输出样例#1
1
输入样例#2
3
输出样例#2
2
思路
用f[i]表示i个数的错排;
第一步:考虑放第n个元素,有n-1种;
扫描二维码关注公众号,回复:
2592709 查看本文章
第二步:考虑第k个元素,如果第n放在了位置k,则还有a[i-1]种。否则还有a[i-2]种;
递推公式:a[i]=(i-1)*(a[i-1]+a[i-2]);
递推边界:a[0]=0;a[1]=0;a[2]=1;
#include <stdio.h>
#include <iostream>
using namespace std;
long long int a[26]={1,0};//超长整形警告
int main()
{
ios::sync_with_stdio(false);
long long int n,i;
cin>>n;
for(i=2;i<=n;i++)
{
a[i]=(i-1)*(a[i-1]+a[i-2]);
}
cout<<a[n]<<endl;
return 0;
}