hdu 2049 不容易系列之(4)——考新郎 解题报告
生活随笔
收集整理的這篇文章主要介紹了
hdu 2049 不容易系列之(4)——考新郎 解题报告
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2049
寫這篇解題報告時 我真的很氣憤 對自己又一次犯下低級錯誤改了兩個小時 int型的數據居然用%I64d輸出 錯了還找不出來 然后就各種試C/C++的輸出 對自己都無語了 也是對自己最近沒A題的教訓吧
這個題使我感受到了數學對于ACM的重要性 可惡上學期高數居然掛了 太頹廢了
排列組合知識 對于n個數取m個數(不及順序)的取法為 n!/( (n-m)!*m!). 當時打的時候沒考慮清楚 沒想到直接打地推公式 就是用一個數組存儲階乘(要是用遞歸會超時)
然后用乘除計算
關于錯排:
給定m個數進行全錯排 只有兩種情況
① 前m-1個已經全部錯排完畢 第m個數只需和m-1個數的其中一個交換
②前m-2個已經全部錯排完畢 而第m-1個是正確的 第m個數需要和m-1交換 第m-1個數 有m-1中選擇
因此 g[m]=(m-1)*g[m-1]+(m-1)*g[m-2].
這個題目就是n個人里面選出m個人進行錯排 輸出排列數 使用乘法原理即可
即m個人錯排數*從n中選出m個人的排列數
代碼如下
1 #include<iostream>2 #include<cstdio>
3 using namespace std;
4 int main()
5 {
6 int i,j,k,ncase,n,m;
7 long long f[25],g[25],ans;
8 f[0]=1;
9 for(i=1;i<=25;i++)
10 {
11 f[i]=f[i-1]*i;
12 }
13
14 g[1]=0;
15 g[2]=1;
16 for(i=3;i<=25;i++)
17 {
18 g[i]=(i-1)*(g[i-1]+g[i-2]);
19 }
20
21 cin>>ncase;
22 for(i=0;i<ncase;i++)
23 {
24 cin>>n>>m;
25 ans=g[m]*( f[n]/f[n-m]/f[m] );
26 cout<<ans<<endl;
27
28 }
29
30 // system("pause");
31 return 0;
32 }
轉載于:https://www.cnblogs.com/yujiaao/archive/2011/10/02/2198056.html
總結
以上是生活随笔為你收集整理的hdu 2049 不容易系列之(4)——考新郎 解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 应聘时漂亮的回答
- 下一篇: WinForm(C#)Checkedli