洛谷P1595
某人写了n封信和n个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。
这就是典型的错排问题。
用f[n]表示n个元素n个位置的放法。
Then
一、先放第一个放在k位置上 有n-1种放法。
二、再放k
1.k放在1那个位置上,有f[n-2]种放法。
2.k不放在1那个位置上,第一个位置其实就相当于第k个位置,有f[n-1]种放法。
f[1]=0; f[2]=1;
f[i]=(i-1)*(f[i-1]+f[i-2]);
上代码:
#include<stdio.h> long long int f[9999]; int main() { int i,j,k; int n,m; scanf("%d",&n); f[1]=0; f[2]=1; for(i=3;i<=n;i++) { f[i]=(i-1)*(f[i-1]+f[i-2]); } printf("%lld",f[n]); return 0; }