HDU - 2048 神、上帝以及老天爷 ( 错排公式 递推 )

本文探讨了一道复杂的递归题目——错排问题,并详细介绍了错排公式的理解和应用。通过具体实例,展示了如何使用C++实现错排公式的递归计算,包括全排列与特定条件下(如字条与名字不匹配)的排列计算。

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

/*
  感觉是目前做过的递归题中,最难的一道
  
  原因在于,需要学错排公式,虽然看着别人的解释,也可以理解这个公式,但总觉得好像有些关键点似懂非懂
  
  对于错排,解释得比较清楚的博客:
  http://blog.youkuaiyun.com/yanghui07216/article/details/47018943
  
  在这个博客里,a数组相当于全排列公式,也就是总共的情况
  b数组是我们题目中描述的情况,所有人拿到的字条都和自己的名字不同,也即,b[i]表示有 i 个人的字条与其名字不匹配的情况
  
  还有比较需要注意的是,要么数组就用double类型,否则,如果用 long long,需要将商进行强制类型转换
*/


#include <iostream>
#include <iomanip>
#define rep(i, k, n) for (int i = k; i < (n); i++)
using namespace std;
const int N = 25;
int t, n;
int main()
{
	cin >> t;
	double a[N] = { 0, 1, 2, 6 }, b[N] = {0, 0, 1, 2};
	rep(i, 4, N)
	{
		a[i] = a[i - 1] * i;
		b[i] = (i - 1) * ( b[i - 1] + b[i - 2] );
	}
	while (t--)
	{
		cin >> n;
		cout << fixed << setprecision(2) << b[n] / a[n] * 100 << "%"<< endl;
		//		cout << fixed << setprecision(2) << double(b[n] * 100.0 ) / a[n] << "%"<< endl;
		// 上面是 a 和 b 为 long long 型数组时的写法
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值