错位排列-组合

来源:互联网 发布:罗德岛大学 知乎 编辑:程序博客网 时间:2024/04/25 23:35

hdu 2049

假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.
 

Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C行数据,每行包含两个整数N和M(1<M<=N<=20)。
 

Output
对于每个测试实例,请输出一共有多少种发生这种情况的可能,每个实例的输出占一行。
 

Sample Input
22 23 2

思路:错位排列,注意一定要用long long

#include <iostream>#include <cstdio>using namespace std;long long c(int n,int m){    int ans=1;    for(int i=1;i<=m;i++)    {        ans=ans*(n-m+i)/i;    }    return ans;}int main(){    int cases,m,n,i;    cin>>cases;    long long  f[22]={0,0,1};    for(i=3;i<22;i++)//错排        f[i]=(i-1)*(f[i-1]+f[i-2]);    while(cases--)    {        scanf("%d%d",&n,&m);      //  ans=C(n,n-m)*f[m]错排        printf("%I64d\n",c(n,n-m)*f[m]);    }    return 0;}