【Ybtoj 第1章 例题1】错排问题【递推】

在这里插入图片描述
在这里插入图片描述


解题思路

首先设 f [ n ] f[n] f[n] 表示 n n n个数的满足题意的方案数。
首先,设一个k 号位置,如果我们将 n 放在k号位置 ( k ≠ n ) ( k ≠ n ) (k=n) ,那么有 ( n − 1 ) ( n − 1 ) (n1) 种放法其次,我们考虑 k 的放置。

  • k 放在 n 的位置:
    这样放的话剩下的无序的元素就还剩 ( n − 2 ) ( n − 2 ) (n2) 个,
    相当于把那 ( n − 2 ) ( n − 2 ) (n2) 个元素错排,方案数是 $f [ n − 2 ] $.
  • k 不放在n的位置:
    这样的话无序的元素就有 ( n − 1 ) ( n − 1 ) (n1) 个,
    相当于把 ( n − 1 ) ( n − 1 ) (n1) 个元素错排,方案数是 f [ n − 1 ] f [ n − 1 ] f[n1] .

所以在 ( n − 1 ) ( n − 1 ) (n1) 的情况下就有 f [ n − 1 ] + f [ n − 2 ] f [ n − 1 ] + f [ n − 2 ] f[n1]+f[n2]种放法。
总方案数就是 ( n − 1 ) × ( f [ n − 1 ] + f [ n − 2 ] ) ( n − 1 ) × ( f [ n − 1 ] + f [ n − 2 ] ) (n1)×(f[n1]+f[n2]) .


代码

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

long long n,f[110];

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]);
}

猜你喜欢

转载自blog.csdn.net/kejin2019/article/details/111407442
今日推荐