ecnu 1129

ecnu 1129
这道题是问题求解和程序设计的作业题,刚拿到这道题的时候,我完全没与递推的概念,第一反应完全是离散数学里面叫得容斥原理,典型的错排问题,一共有n对新人,有m对是错误的,首先通过c(n,m)选出错误的新人是哪些,然后就是算出这m对新人错误排列的方法。
根据容斥原理的公式推出m对错误的情况有m!-c(m,1)(m-1)!+c(m,2)(m-2)!+.....+(-1)^mc(m,m)0!;
在乘上c(n,m)就好了
化简后得a(n,m)(1-1/1!+1/2!-....+(-1)^m/m!);
算到这里我就犯愁了,这括号了的这些个东西怎么算阿,脑子完全堵住了,缓过神来才发现,要实现它并不困难
程序如下:
 1 #include < stdio.h >
 2 __int64 f( int  n, int  m){
 3     __int64 r,tmp1 = 1 ;
 4      int  i;
 5      for (i = n;i > n - m;i -- )
 6         tmp1 *= i;
 7     r = tmp1;
 8      for (i = 1 ;i <= m;i ++ ){
 9         tmp1 = ( - tmp1) / i;
10         r += tmp1;}
11     return r;
12 }
13 int  main(){
14      int  t,m,n;
15     __int64 result;
16     scanf( " %d " , & t);
17      while ((t -- ) > 0 ){
18         scanf( " %d%d " , & n, & m);
19         result = f(n,m);
20         printf( " %I64d\n " ,result);
21     }
22     return  0 ;
23 }

你可能感兴趣的:(ecnu 1129)