题目大意
有r*s张扑克牌,数字从1到 r,每种数字有s种颜色。
询问对于所有随机的d张牌,能选出c张组成顺子的概率和组成同花的概率。
解题分析
对于组成顺子的概率,令dp[i][j][k]表示一共选出了i张牌,数字从1~j,最后有k张牌是顺子。对于每个数字进行考虑,有0~s种选法。要保证连续c张牌的顺子。
对于组成同花的概率,令dp[i][j]表示一共选出了i张牌,颜色从1~j,。对于每种颜色进行考虑,有0~r种选法。要保证没有c张牌是相同颜色的。
最后用高精度来输出答案。
参考程序
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int N=30; 5 6 class bign 7 { 8 public: 9 enum {MAXN = 100}; 10 int len, s[MAXN]; 11 void clean() 12 { 13 while(len > 1 && !s[len-1]) len--; 14 } 15 bign () 16 { 17 memset(s, 0, sizeof(s)); 18 len = 1; 19 } 20 bign (int num) { *this = num; } 21 bign (long long num) { *this = num; } 22 bign (const char *num) { *this = num; } 23 bign operator = (const long long num) 24 { 25 char s[MAXN]; 26 sprintf(s, "%I64d", num); 27 *this = s; 28 return *this; 29 } 30 bign operator = (const int num) 31 { 32 char s[MAXN]; 33 sprintf(s, "%d", num); 34 *this = s; 35 return *this; 36 } 37 bign operator = (const char *num) 38 { 39 for(int i = 0; num[i] == '0' && num[1]!='