[洛谷]P1595 信封问题 (#递推 -1.2)

题目描述

某人写了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;
}

猜你喜欢

转载自blog.csdn.net/Apro1066/article/details/81229321