X-man

导航

hdu 2049 不容易系列之(4)——考新郎 (错排递推)

  当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推.
  第一步,把第n个元素放在一个位置,比如位置k,一共有n-1种方法;
  第二步,放编号为k的元素,这时有两种情况
      ⑴把它放到位置n,那么,对于剩下的n-1个元素,由于第k个元素放到了位置n,剩下n-2个元素就有M(n-2)种方法;
      ⑵第k个元素,不把它放到位置n,这时,对于这n-1个元素,有M(n-1)种方法;
  综上得到:
      M(n)=(n-1)[M(n-2)+M(n-1)]
  特殊地,M⑴=0,M⑵=1
 
#include<stdio.h>
#include<algorithm>
using namespace std;
long long ans[21];
int Quanchuopai()
{
    int i;
    ans[1]=0;
    ans[2]=1;
    for(i=3;i<21;i++)
    {
        ans[i]=(i-1)*(ans[i-1]+ans[i-2]);
    }
    return 0;
}
int main()
{
    int i,p,_case;
    int n,m;
    Quanchuopai();
    scanf("%d",&_case);
    while(_case--)
    {
        scanf("%d%d",&n,&m);
        p=n-m;
        p=min(p,m);
        long long r=1; //用int 型会溢出,Wrong
        for(i=0;i<p;i++)
        r*=(n-i);
        for(i=1;i<=p;i++)
        r/=i;
        printf("%I64d\n",r*ans[m]);
    }
    return 0;
}

 

posted on 2013-07-25 11:11  雨钝风轻  阅读(353)  评论(0编辑  收藏  举报