转载自:http://blog.csdn.net/u013611908/article/details/44545955

题目大意:一副牌除掉大小王,然后有一些已经形成了序列,让你算剩下的牌能组合出多少种比给的序列小的组合。

思路:搜索,分这个位置相同或者小于,假如放一个小于的,则剩下的就是全排列

只不过这边的全排列是相同元素的全排列。

所采取的是位置的选择的排列方式。

比如1112233这个所有的情况就是c(7,3)*c(4,2)*c(2,2)

题目wa了很多发。

题目需要注意,是严格小于,等于是不行的。

另外就是涉及到剩的张数比给的少的情况。

这边直接给数据让大家测试吧,ps:是抄别人的。

Input:
KKKKQQQQJJJJ10101010999988887777666655554444
K
AA22334455667788991010JJKKK
KAA22334455667788991010JJQK
KKKKJJJJQQQQ1010101099998888777766665555444433332222AAAA
AA22334455667788991010JJKKQQ
KKKJJJJQQQQ1010101099998888777766665555444433332222AAAA
Output:
34650
944696453
5
596617684
0
5
1
 
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. using namespace std;
  6. #define mod 1000000007
  7. int a[15];
  8. char str[60];
  9. long long ans = 0;
  10. long long c[60][60];
  11. void init()
  12. {
  13. for (int i = 0; i < 60;i++)c[i][0] = c[i][i] = 1;
  14. for (int i = 2; i < 60;i++)
  15. for (int j = 1; j < i; j++)
  16. c[i][j] = (c[i - 1][j] + c[i - 1][j - 1])%mod;
  17. }
  18. long long gao(int sum)
  19. {
  20. long long ans = 1;
  21. for (int i = 1; i < 14; i++)
  22. {
  23. ans = (ans*c[sum][a[i]])%mod;
  24. sum -= a[i];
  25. }
  26. return ans;
  27. }
  28. void dfs(int cur, int sum)
  29. {
  30. if (!str[cur])
  31. {
  32. return;
  33. }
  34. if (sum == 0)
  35. {
  36. ans++;
  37. return;
  38. }
  39. int k = str[cur] - 48;
  40. for (int i = 1; i<k; i++)
  41. {
  42. if (a[i]>0)
  43. {
  44. a[i]--;
  45. ans = (ans + (gao(sum-1)) % mod) % mod;
  46. a[i]++;
  47. }
  48. }
  49. if (a[k]>0)
  50. {
  51. a[k]--;
  52. dfs(cur + 1, sum - 1);
  53. }
  54. }
  55. int main()
  56. {
  57. init();
  58. while (~scanf("%s", str))
  59. {
  60. int len = strlen(str);
  61. int j = 0;
  62. for (int i = 1; i < 14; i++)
  63. a[i] = 4;
  64. for (int i = 0; i < len; i++)
  65. {
  66. if (str[i] == 'A')
  67. {
  68. str[j++] = 1 + 48;
  69. a[1]--;
  70. }
  71. else
  72. if (str[i] == '1')
  73. {
  74. str[j++] = 10 + 48;
  75. a[10]--;
  76. }
  77. else
  78. if (str[i] == 'J')
  79. {
  80. str[j++] = 11 + 48;
  81. a[11]--;
  82. }
  83. else
  84. if (str[i] == 'Q')
  85. {
  86. str[j++] = 12 + 48;
  87. a[12]--;
  88. }
  89. else
  90. if (str[i] == 'K')
  91. {
  92. str[j++] = 13 + 48;
  93. a[13]--;
  94. }
  95. else
  96. if (str[i] == '0')
  97. continue;
  98. else
  99. {
  100. str[j++] = str[i];
  101. a[str[i] - 48]--;
  102. }
  103. }
  104. str[j] = 0;
  105. int sum = 0;
  106. for (int i = 1; i < 14; i++)
  107. sum += a[i];
  108. ans = 0;
  109. if (sum != 0)
  110. dfs(0, sum);
  111. printf("%lld\n", ans);
  112. }
  113. return 0;
  114. }

【搜索】【组合数学】zoj3841 Card的更多相关文章

  1. xdoj-1117(记忆化搜索+组合数学)

    因为我是从上到下,所以就不叫动态规划而叫记忆化搜索吧 (不过运行时间只有3ms....应该是很不错的吧) 排版怎么那么难看...编辑的时候不是这样子的啊?! 思想 : 大眼一看应该是一道很裸的状压dp ...

  2. Codeforces Gym 100431B Binary Search 搜索+组合数学+高精度

    原题链接:http://codeforces.com/gym/100431/attachments/download/2421/20092010-winter-petrozavodsk-camp-an ...

  3. 【10.31校内测试】【组合数学】【记忆化搜索/DP】【多起点多终点二进制拆位Spfa】

    Solution 注意取模!!! Code #include<bits/stdc++.h> #define mod 1000000007 #define LL long long usin ...

  4. 2018.09.19 atcoder Card Game for Three(组合数学)

    传送门 简单组合数学想优化想了半天啊233. 我们只需考虑翻开n张A,b张B,c张C且最后一张为A的选法数. 显然还剩下m+k−b−cm+k-b-cm+k−b−c张牌没有选. 这样的话无论前n+b+c ...

  5. AT2070 Card Game for Three(组合数学)

    传送门 解题思路 前面的思路还是很好想的,就是要枚举最后一个\(a\)在哪出现算贡献,之后我先想的容斥,结果彻底偏了..后来调了很久发现自己傻逼了,似乎不能容斥,终于走上正轨23333.首先可以写出一 ...

  6. Atcoder Regular Contest 061 D - Card Game for Three(组合数学)

    洛谷题面传送门 & Atcoder 题面传送门 首先考虑合法的排列长什么样,我们考虑将每次操作者的编号记录下来形成一个序列(第一次 A 操作不计入序列),那么显然这个序列中必须恰好含有 \(n ...

  7. 算法讲堂二:组合数学 & 概率期望DP

    组合数学 1. 排列组合 1. 加法原理 完成一列事的方法有 n 类,其中第 i 类方法包括\(a_i\)种不同的方法,且这些方法互不重合,则完成这件事共有 \(a_1 + a_2 + \cdots ...

  8. 组合数学or not ---- n选k有重

    模板问题: 1. 取物品 (comb.pas/c/cpp) [问题描述] 现在有n个物品(有可能相同),请您编程计算从中取k个有多少种不同的取法.[输入] 输入文件有两行,第一行包含两个整数n,k(2 ...

  9. I.MX6 uSDHC SD card register

    /**************************************************************************** * I.MX6 uSDHC SD card ...

随机推荐

  1. v4l2API无法执行VIDIOC_DQBUF的问题

    一.PC虚拟机下ubuntu14.04.1环境下 源文件:show.c  USB摄像头格式yuyv: 申请缓冲帧数2,分辨率640*480  阻塞无法执行 申请缓冲帧数4,分辨率640*480  阻塞 ...

  2. http、https 等 常用默认端口号

    ⑴. HTTP协议代理服务器常用端口号:80/8080/3128/8081/9080⑵. SOCKS代理协议服务器常用端口号:1080⑶. FTP(文件传输)协议代理服务器常用端口号:21⑷. Tel ...

  3. python进阶之类常用魔法方法和魔法属性

    前言 前面我们总结过了python的关键字.运算符.内置函数.语法糖等与python魔法方法之间的关系,现在我们更细一点,看看python的面向对象编程有哪些常用的魔法属性和魔法方法. 魔法属性 对于 ...

  4. STM32 IAP升级

    STM32 IAP在线升级,用Jlink设置读保护后前5K字节是默认加了写保护的,导致IAP升级时擦除和写入FLASH不成功,可以做两个boot,前5k为第一个boot程序,上电时负责跳转到APP还是 ...

  5. java 一个函数如何返回多个值

    在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值的key是什么,只能通过doc或者通过 ...

  6. Nginx - keepliave 相关知识点

    目录 - 1. 前言- 2. keepalive 介绍- 3. Nginx 与 keepalive 的关系    - 3.1 Nginx - keepalive_timeout    - 3.2 Ng ...

  7. python中的多进程

    具体参考这个博客地址:http://www.cnblogs.com/lxmhhy/p/6052167.html

  8. Python学习笔记:startswith & endswith 判断开头结尾是否为指定字符串

    作用: 判断字符串是否以指定字符或子字符串结尾,常用于判断文件类型. 如果以指定后缀结尾返回True,否则返回False. 可选参数"start"与"end"为 ...

  9. U盘删除文件时提示“文件或目录损坏且无法读取”的解决方法

    U盘删除文件时提示“文件或目录损坏且无法读取”的解决方法 出现原因:在写入或读取文件时,进行复制操作,此时复制到的文件是不完整的!或者移动硬盘/U盘中途被拔出,导致文件损坏 异常现象:被删文件(夹)属 ...

  10. RelativeLayout

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...