题目
众所周知,数回惨败于九峰之前,叉同学还有一段黑历史:163点也玩不过九峰
163点的规则如下:从一副去掉大王小王的扑克牌中抽出六张,A,J,Q,K视为1,11,12,13,用这6张牌经过有理数的加减乘除运算(过程中可以出现分数)且每张牌都用到的情况下,如[9,9,9,7,4,7],可以发现(9+9+7)*4+9*7=163或者(9+9+4+9/7)*7=163
在多次163比试惨败于九峰后,叉同学决定写一个打表程序作弊,但是如果按照52张取6张的思维去枚举,方案有20358520种,考虑到花色不同但牌型相同的组合其实是一样的,所以实际上对于算163点来讲,不同性质的牌组会比(526)\tbinom{52}{6}(652)小很多,但叉哥的数学水平实在垃圾,并不会算去重后的这个数字。
你可以帮他算出来吗?
无输入
输出一个方案数
分析
从1~13中任选6个数,每个数字最多选4次,因为选出的所以方案都可以算出163,用组合的知识解决,分析出所有方案
- C(13,6)(=1716)----数字无重复(例.123456)
- C(13,5)×C(5,1)(=6435)----有一个数字出现了两次,其余均出现一次(例.112345)
- C(13,4)×C(4,1)(=2860)----有一个数字出现了三次,其余均出现一次(例.111234)
- C(13,3)×C(3,1)(=858)----有一个数字出现了四次,其余均出现一次(例.111123)
- C(13,4)×C(4,2)(=4290)----有两个数字出现了两次,其余均出现一次(例.112234)
- C(13,2)(=78)----有两个数字出现三次(例.111222)
- C(13,3)(=286)----有三个数字出现两次(例.112233)
- C(13,2)×C(2,1)(=156)----有一个数字出现两次,一个数字出现四次(例.112222)
- C(13,3)×C(3,1)×C(2,1)(=1716)----有一个数字出现两次,一个数字出现三次,其余均出现一次(例.112223)
将所有的方案数加起来,手算最后直接输出结果,或者写函数求出组合数结果,再加起来
最后结果是18395
#include<iostream>
using namespace std;
int main(){
cout<<18395;
}
或
#include<iostream>
#include<math.h>
#include<cstring>
#include<algorithm>
using namespace std;
int d[10],su;
int sum=0;
int RK(int n,int k,int d[],const int NUM)
{
int i = n;
if(k > n) return sum;
while(i>=k)
{
d[NUM-k] = i;
if(k>1) RK(i-1,k-1,d,NUM);
else
sum++;
i--;}
return sum;}
int main(){
su+=RK(13,6,d,6);sum=0;
su+=RK(13,5,d,5)*5;sum=0;
su+=RK(13,4,d,4)*4;sum=0;
su+=RK(13,4,d,4)*6;sum=0;
su+=RK(13,3,d,3)*3;sum=0;
su+=RK(13,3,d,3)*6;sum=0;
su+=RK(13,3,d,3);sum=0;
su+=RK(13,2,d,2)*2;sum=0;
su+=RK(13,2,d,2);
printf("%d",su);
}