【ybtoj 高效进阶1.1】【递推】错排问题

【ybtoj 高效进阶1.1】【递推】错排问题

在这里插入图片描述


解题思路

设f[n]为n个数的错排个数
假设有n个数
第n个数放在第k(1~n-1)位上
1.k放在第n位上,那么还剩n-2个数错排,那么这种情况下,有(n-1)* f[n-2] 种
2.k不放在第n位上,那么剩下n-1(包括k)个数错排(因为k不能放在第n位),那么有(n-1)* f[n-1]
所以f[n]为(n-1)* (f[n-1]+f[n-2])


代码

#include<iostream>
#include<cstdio>
using namespace std;
long long n,f[30];
int main()
{
    
    
	scanf("%lld",&n);
	f[1]=0,f[2]=1;
	for (int i=3;i<=n;i++)
	    f[i]=(i-1)*(f[i-1]+f[i-2]);
	printf("%lld",f[n]);
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/qq_45621109/article/details/111594330