杭电2049题

//考新郎
//思路:在错排公式的基础上加入排列组合的因素
#include <iostream>
using namespace std;
__int64 fun(int n);
int main()
{
 int case_num;
 cin>>case_num;
 for(int i=0;i<case_num;i++)
 {
  int n,m;
  while(cin>>n>>m)
  {
   __int64 *p =new __int64[m+1];
      p[1] = 0;
   p[2] = 1;
   for(int i=3;i<m+1;i++)
   {
    p[i] = (i-1)*(p[i-1]+p[i-2]);
   }
   //注意:不能是p[m]*fun(n)/(fun(m)*fun(n-m)),因为p[m]与fun(n)相乘会越界
   printf("%I64d\n",fun(n)/(fun(m)*fun(n-m))*p[m]);
      delete []p;
  }
 }
}
__int64 fun(int n)
{
 __int64 result;
 if(n==1 || n==0)
  return 1;
 else
 {
  result = n*fun(n-1);
 } 
 return result;
}

你可能感兴趣的:(杭电)