http://lightoj.com/volume_showproblem.php?problem=1060

有一些用尼康托展开http://blog.csdn.net/niushuai666/article/details/6611131,简单的尼康托,每个字母多个数的还不会

组合数学解看起来比较简单

给定一个字符串和k,求字符串第k大字典序的排列...

康拓逆展开...可以求没有重复元素的第k个排列,有重复的话,方法是一样的,只是求解方案数变了。

由单纯的阶乘变为len!/cnt[i]!(0<=i<26),cnt[i]为第i个字母出现的次数。

而且某一位要放置的字母出现多次,那么只需要计算一次就好,因为所有的排列都是一模一样的。

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cstdio>
 6 #include <vector>
 7 #include <ctime>
 8 #include <queue>
 9 #include <list>
10 #include <set>
11 #include <map>
12 using namespace std;
13 #define INF 0x3f3f3f3f
14 typedef long long LL;
15
16 char s[30];
17 int a[30];
18 LL fac[30];
19 void init()
20 {
21     fac[0] = 1;
22     for(int i = 1; i < 21; i++)
23         fac[i] = fac[i-1] * i;
24 }
25 int main()
26 {
27     int t, n;
28     init();
29     scanf("%d", &t);
30     for(int ca = 1; ca <= t; ca++)
31     {
32         scanf("%s %d", s, &n);
33         int len = strlen(s);
34         memset(a, 0, sizeof(a));
35         for(int i = 0; i < len ; i++)
36             a[s[i]-'a']++;
37         LL res = fac[len];
38         for(int i = 0; i < 26; i++)//相同字母没有区别
39             if(a[i]) res /= fac[a[i]];
40         if(res < n)
41         {
42             printf("Case %d: Impossible\n", ca);
43             continue;
44         }
45         printf("Case %d: ", ca);
46         for(int i = 0; i < len; i++)
47         {
48             for(int j = 0; j < 26; j++)
49             {
50                 if(a[j] == 0) continue;
51                 a[j]--;
52                 LL te = fac[len-i-1];
53                 for(int k = 0; k < 26; k++)
54                 {
55                     if(a[k]) te /= fac[a[k]];
56                 }
57                 if(te >= n)//大于等于要得到的字典序,get
58                 {
59                     printf("%c", j+'a');
60                     break;
61                 }
62                 a[j]++;
63                 n -= te;//比要得到的字典序小,当然减去
64             }
65         }
66         printf("\n");
67     }
68     return 0;
69 }

转载于:https://www.cnblogs.com/luomi/p/5964505.html

lightoj1060_组合数学相关推荐

  1. 不畏浮云遮望眼--离散数学和组合数学

    不畏浮云遮望眼,基础很重要! 离散数学是算法和数据结构的基础,而算法和数据结构又是什么的基础?不解释了. 1.<离散数学及其应用> 作者: (美)Kenneth H. R 出版社: 机械工 ...

  2. szucodeforce训练1081C组合数学lucas定理,div2 627的D dfs +剪枝优化,697D Puzzles{dfs序+概率}

    给你n个方格排成一行,有m种颜色,然后要把这n个方格分成k+1段,每段涂不同的颜色,问有多少种方法. 组合数学Lucas定理 排列组合问题,首先要在n-1个位置里面选出k个位置当作段与段的分割点,然后 ...

  3. 【数学专题】组合数学与计数

    整理的算法模板合集: ACM模板 目录 AcWing 1307. 牡牛和牝牛(递推) AcWing 1308. 方程的解 AcWing 1309. 车的放置(组合数学,分类讨论) AcWing 131 ...

  4. 组合数学实验——二分图匹配算法

    2019独角兽企业重金招聘Python工程师标准>>> 大一时候写的代码,忽然翻了出来.... 算法:组合数学中文第4版 机械工业出版社 P234 ID就先隐藏掉了 // // // ...

  5. Sequence(组合数学,集合不同元素的个数)

    Sequence [组合数学] 时间限制: 3 Sec  内存限制: 128 MB 提交: 138  解决: 52 [提交][状态][讨论版] 题目描述 在某个夜黑月高的晚上,!!!,原谅我编不下去了 ...

  6. 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 2 )

    文章目录 一.指数生成函数求解多重集排列示例 2 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相 ...

  7. 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 )

    文章目录 一.指数生成函数求解多重集排列示例 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...

  8. 【组合数学】指数生成函数 ( 证明指数生成函数求解多重集排列 )

    文章目录 一.证明指数生成函数求解多重集排列 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...

  9. 【组合数学】指数生成函数 ( 指数生成函数性质 | 指数生成函数求解多重集排列 )

    文章目录 一.指数生成函数性质 二.指数生成函数求解多重集排列 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | ...

最新文章

  1. telnet命令的使用
  2. 关于耳机的国标和美标的区分
  3. Spring Cloud Alibaba - 04 Nacos 领域模型划分
  4. java 安卓 html_java – Android的HtmlUnit替代品?
  5. Java 编写推箱子报告_Java推箱子怎么写啊?
  6. 【kafka】 kafka 0.10报错IOException: Connection to 1 was disconnected before the response was read
  7. Vision GUI programming products
  8. 贝叶斯数据分析_Python数据分析 · 朴素贝叶斯详解
  9. 迅为IMX6Q PLUS开发板烧写Android6.0系统方法
  10. Internet Explorer 8的新特性和自定义部署
  11. JUC总览,来自汪文君整理
  12. 计算机毕业设计Java大学生科技创新项目管理系统(源码+系统+mysql数据库+lw文档)
  13. 0.96寸OLED12864显示屏设计方案(原理图+PCB+BOM表+程序)
  14. 数据库原理与应用实验3--(数据库的简单查询和连接查询)
  15. python自动排版_你熟悉Python的代码规范吗?如何一键实现代码排版
  16. 使用python计算内含报酬率
  17. unity编程实践-牧师与魔鬼动作分离版
  18. java毕业设计——基于ssm的NBA球队|篮球管理系统(源代码+论文+开题报告)
  19. 2016,Java成神初年
  20. 蚂蚁分类信息系统伪静态规则设置教程

热门文章

  1. struts.xml mysql_mybatis3.3 + struts2.3.24 + mysql5.1.22开发环境搭建及相关说明
  2. 数字图像处理与python实现_数字图像处理学习(2)—— 图像直方图均衡与图像匹配(python实现)...
  3. 用python操作浏览器的三种方式_python的webbrowser模块支持对浏览器进行一些操作...
  4. Ubuntu14.04系统下安装配置OpenCV 4.0.0开发环境全过程
  5. [深度学习] 自然语言处理 --- Self-Attention(三) 知识点与源码解析
  6. Pedestrian Identification (2) ——研究现状总结
  7. 问答机器人接口python_设计用于机器学习工程的Python接口
  8. 迁移学习 迁移参数_迁移学习简介
  9. PHP的表单获取与HHTP请求方式
  10. 不同时期的同学的聚会