错排问题

洛谷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;
}
 
 


猜你喜欢

转载自blog.csdn.net/wyh1618/article/details/80383556