lightoj1060_组合数学
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.<离散数学及其应用> 作者: (美)Kenneth H. R 出版社: 机械工 ...
- szucodeforce训练1081C组合数学lucas定理,div2 627的D dfs +剪枝优化,697D Puzzles{dfs序+概率}
给你n个方格排成一行,有m种颜色,然后要把这n个方格分成k+1段,每段涂不同的颜色,问有多少种方法. 组合数学Lucas定理 排列组合问题,首先要在n-1个位置里面选出k个位置当作段与段的分割点,然后 ...
- 【数学专题】组合数学与计数
整理的算法模板合集: ACM模板 目录 AcWing 1307. 牡牛和牝牛(递推) AcWing 1308. 方程的解 AcWing 1309. 车的放置(组合数学,分类讨论) AcWing 131 ...
- 组合数学实验——二分图匹配算法
2019独角兽企业重金招聘Python工程师标准>>> 大一时候写的代码,忽然翻了出来.... 算法:组合数学中文第4版 机械工业出版社 P234 ID就先隐藏掉了 // // // ...
- Sequence(组合数学,集合不同元素的个数)
Sequence [组合数学] 时间限制: 3 Sec 内存限制: 128 MB 提交: 138 解决: 52 [提交][状态][讨论版] 题目描述 在某个夜黑月高的晚上,!!!,原谅我编不下去了 ...
- 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 2 )
文章目录 一.指数生成函数求解多重集排列示例 2 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相 ...
- 【组合数学】指数生成函数 ( 指数生成函数求解多重集排列示例 )
文章目录 一.指数生成函数求解多重集排列示例 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...
- 【组合数学】指数生成函数 ( 证明指数生成函数求解多重集排列 )
文章目录 一.证明指数生成函数求解多重集排列 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | 与二项式系数相关 ...
- 【组合数学】指数生成函数 ( 指数生成函数性质 | 指数生成函数求解多重集排列 )
文章目录 一.指数生成函数性质 二.指数生成函数求解多重集排列 参考博客 : 按照顺序看 [组合数学]生成函数 简要介绍 ( 生成函数定义 | 牛顿二项式系数 | 常用的生成函数 | 与常数相关 | ...
最新文章
- telnet命令的使用
- 关于耳机的国标和美标的区分
- Spring Cloud Alibaba - 04 Nacos 领域模型划分
- java 安卓 html_java – Android的HtmlUnit替代品?
- Java 编写推箱子报告_Java推箱子怎么写啊?
- 【kafka】 kafka 0.10报错IOException: Connection to 1 was disconnected before the response was read
- Vision GUI programming products
- 贝叶斯数据分析_Python数据分析 · 朴素贝叶斯详解
- 迅为IMX6Q PLUS开发板烧写Android6.0系统方法
- Internet Explorer 8的新特性和自定义部署
- JUC总览,来自汪文君整理
- 计算机毕业设计Java大学生科技创新项目管理系统(源码+系统+mysql数据库+lw文档)
- 0.96寸OLED12864显示屏设计方案(原理图+PCB+BOM表+程序)
- 数据库原理与应用实验3--(数据库的简单查询和连接查询)
- python自动排版_你熟悉Python的代码规范吗?如何一键实现代码排版
- 使用python计算内含报酬率
- unity编程实践-牧师与魔鬼动作分离版
- java毕业设计——基于ssm的NBA球队|篮球管理系统(源代码+论文+开题报告)
- 2016,Java成神初年
- 蚂蚁分类信息系统伪静态规则设置教程
热门文章
- struts.xml mysql_mybatis3.3 + struts2.3.24 + mysql5.1.22开发环境搭建及相关说明
- 数字图像处理与python实现_数字图像处理学习(2)—— 图像直方图均衡与图像匹配(python实现)...
- 用python操作浏览器的三种方式_python的webbrowser模块支持对浏览器进行一些操作...
- Ubuntu14.04系统下安装配置OpenCV 4.0.0开发环境全过程
- [深度学习] 自然语言处理 --- Self-Attention(三) 知识点与源码解析
- Pedestrian Identification (2) ——研究现状总结
- 问答机器人接口python_设计用于机器学习工程的Python接口
- 迁移学习 迁移参数_迁移学习简介
- PHP的表单获取与HHTP请求方式
- 不同时期的同学的聚会