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

本文介绍了一种通过递推公式解决错排问题的方法,并提供了一个使用C++实现的具体示例。错排问题是指将n个信封与n封信进行错误匹配的所有可能情况数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

某人写了n封信和n个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。

输入输出格式

输入格式:

一个信封数n(n<=20)

输出格式:

一个整数,代表有多少种情况。

输入输出样例

输入样例#1

2

输出样例#1

1

输入样例#2

3

输出样例#2

2

思路

用f[i]表示i个数的错排;

第一步:考虑放第n个元素,有n-1种;

第二步:考虑第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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值