#include using namespace std; unsigned long long int nCr(int n,int r); unsigned long long int fact(int n); unsigned long long int nPr(int n,int r); int main(){ // 改造トランプにも出来る int n = 52; // カードの枚数 n = ne + no; int ne = 24; // 偶数カードの枚数 int no = n - ne; // 奇数カードの枚数 int r; // 取る枚数 r = re + ro; // 奇数偶数の取る枚数に制限を加えることが出来る int re; // 取る偶数のカード枚数 int ro; // 取る奇数のカード枚数 int toc = 0; int tec = 0; unsigned long long int te = 0; // 結果が偶数となる場合の数 unsigned long long int to = 0; // 結果が奇数となる場合の数 unsigned long long int total = 0; // 全ての場合の数 for(r = 0;r <= n;r++){ to = 0; te = 0; for(int i = 0;i <= r;i++){ if(i % 2 == 1 && r - i >= 0 && i <= 28 && r - i <= 24) to += nCr(no,i) * nCr(ne,r - i); else if(i % 2 == 0 && r - i >= 0 && i <= 28 && r - i <= 24) te += nCr(no,i) * nCr(ne,r - i); } /*long double tel = (long double)te; long double tol = (long double)to; long double dis; long double totall = tel + tol; dis = tol / tel; *///printf("%") //total = to + te; //cout << "全ての場合の数は " << to + te << " 通り\n"; //cout << "偶数となる場合の数は " << te << " 通り\n"; //cout << "奇数となる場合の数は " << to << " 通り\n"; //to > te ? cout << "半 " : cout << "丁 "; //cout << r << " 奇数 : 偶数 = " << to << " : " << te << " : " << to + te << endl; to > te ? toc++ : tec++; to > te ? cout << "o " : cout << "e "; cout << r << "," << to << "," << te << "," << to + te << "\n"; // cout << "奇数 / 全て : 偶数 / 全て : 奇数 / 偶数 = " << tol / totall << " : " << tel / totall << " : " << dis << endl; // cout << "" << r << " 枚のカードのときは "; // to > te ? cout << "半の確率が高いです.\n" // : cout << "丁の確率が高いです. \n"; //to > te ? cout << "奇数の場合の数が " << to - te << " 通り多いです.\n" //: cout << "偶数の場合の数が " << te - to << " 通り多いです.\n"; } cout << "even count : odd count = " << toc << " : " << tec << "\n"; //cout << nCr(28,14) * nCr(24,12) << endl; return 0; } // Permutation unsigned long long int nPr(int n,int r){ unsigned long long int result = 1; int nn = n; int rr = r; if(rr == 0) return 1; for(int i = 0;i <= rr - 1;i++){ result = result * (nn - i); } return result; } // Combination unsigned long long int nCr(int n,int r){ unsigned long long int result = 0; int nn = n; int rr = r; if(nn / 2 < rr && nn % 2 == 0) result = nPr(nn,nn - rr) / fact(nn - rr); // ベースとなるトランプの枚数が奇数のとき //else if((nn + 1) / 2 <= rr && nn % 2 == 1) result = nPr(nn,nn - rr) /fact(nn - rr); else result = nPr(nn,rr) / fact(rr); //result = nPr(nn,rr) / fact(rr); return result; } // factorial unsigned long long int fact(int n){ unsigned long long int ans = 1; int nn = n; if(nn == 0) return 1; else if(nn < 0) cout << "入力値エラー: \n" << nn; else ans = (unsigned long long int)nn * fact(nn - 1); return ans; }