poj 1715 Hexadecimal Numbers 排列组合


 1 /**
2 大意: 给定16进制数的16个字母,,求第k大的数,,要求数的长度最大为8.,并且每个数互不相同。
3 思路: 从高到低挨个枚举,每一位能组成的排列数 ,拿最高位来说,能做成的排列数为15*A(15,len-i)
4 第二位 A(14,len-2)。。这样就可以找到k大的数的长度
5 接下来 。找第k大的数。同上理 ,挨个枚举每一位即可。。若加上该位的排列数大于k,则该位就是这个数,继续枚举下一位
6 **/
7
8 /** 大神思路
9 首先确定数字串的长度Len:从大到小枚举Len,每个Len下有15*P(15, Len-1)个数字串。每次用这个个数扣除输入的序数Count,直到序数Count将扣为负数时停止,就确定了长度Len。
10
11 然后从高位到低位,从大到小确定每位数字:设当前确定的数字为第i位,则第i位的任何一个取值,都有P(16 - (Len - i + 1), i - 1)个数字串将已确定的第1到i位作为前缀。每次用这个个数扣除输入的序数Count,直到序数Count将扣为负数时停止,就确定了当前位的数字。
12
13 注意不能有前导0。
14 **/
15 #include <iostream>
16
17 using namespace std;
18 char num[16]={‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘};
19 int ans[10];
20
21 int Axy(int x,int y){
22 int res =1;
23 if(y==0)
24 return 1;
25 while(y--){
26 res *= x;
27 x--;
28 }
29 return res;
30 }
31
32 void solve(int count){
33 bool vis[16]={0},head = false;
34 int uselen = 0,countv;
35 for(int i=1;i<=8;i++){
36 int cnt = 15;
37 while(cnt){
38 if(!vis[cnt]){
39 if((countv = Axy(16-1-uselen,8-i))<count){
40 count -= countv;
41 }else{
42 vis[cnt] = true;
43 break;
44 }
45 }
46 cnt--;
47 }
48 ans[i] = num[cnt];
49 if(head||ans[i]!=‘0‘) uselen++;
50 if(ans[i]!=‘0‘) head = true;
51 }
52 }
53
54 int main()
55 {
56 int cnt;
57 while(cin>>cnt){
58 bool head = false;
59 solve(cnt);
60 for(int i=1;i<=8;i++){
61 if(head||ans[i]!=‘0‘){ //去除前导0
62 cout<<(char)ans[i];
63 head = true;
64 }
65 }
66 if(!head) // 若全为0 ,则输出0
67 cout<<0;
68 cout<<endl;
69 }
70 return 0;
71 }

poj 1715 Hexadecimal Numbers 排列组合

时间: 2024-10-11 08:10:17

poj 1715 Hexadecimal Numbers 排列组合的相关文章

POJ 1715 Hexadecimal Numbers 组合数学

POJ 1715 Hexadecimal Numbers 组合数学 题目地址 题意: 一个十六进制,最多8位而且每一位都不能重复,求所有符合的数中第n大的数.注意不能有前导0. 分析: 可以发现,第i位的任何一个取值,都有P(unused, i - 1)个数字串,只要从高位向低位,从F到1找过去,看第n个是否在这个区间里面,如果没有的话就把那位置为0,然后找下一位就行了. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * File: 1715.c

poj 3252 Round Numbers 【推导&#183;排列组合】

以sample为例子 [2,12]区间的RoundNumbers(简称RN)个数:Rn[2,12]=Rn[0,12]-Rn[0,1] 即:Rn[start,finish]=Rn[0,finish]-Rn[0,start-1] 所以关键是给定一个X,求出Rn[0,X] 现在假设X=10100100  这个X的二进制总共是8位,任何一个小于8位的二进制都小于X 第一部分,求出长度为[0,7]区间内的二进制是RoundNumber的个数  对于一个长度为Len的二进制(最高位为1),如何求出他的Rou

POJ 3421 X-factor Chains (因式分解+排列组合)

题意:一条整数链,要求相邻两数前一个整除后一个.给出链尾的数,求链的最大长度以及满足最大长度的不同链的数量. 类型:因式分解+排列组合 算法:因式分解的素因子个数即为链长,链中后一个数等于前一个数乘以某素因子,所以链的数量即为这些因子不全相异的全排列数:A!/(a1!a2!a3!..) #include <cstdio> #include <cmath> #include <iostream> using namespace std; typedef long long

排列组合问题

一.不同元素子集问题 78. Subsets Given a set of distinct integers, nums, return all possible subsets. 给定一组非重复数字,求出所有可能的子集 解析: 例如 [1,2,3],解法: 首先放[],然后往已有的[]中放1 1. 首先放1 此时已有[ [], 1 ] 2. 然后对[ [], 1 ] 放2 于是此时有 [ [], [1], [2], [1,2] ] 3. 然后对[ [], [1], [2], [1,2] ]

排列&组合

What's the Difference? In English we use the word "combination" loosely, without thinking if the order of things is important. In other words: "My fruit salad is a combination of apples, grapes and bananas" We don't care what order the

输入N个数,输出所有可能的排列组合(6+个小时啊,耶稣~)

输入N个数,输出所有可能的排列组合 一行代码一行泪...手都被发热的笔记本烤的不舒服了....6个多小时过去鸟...终于粗来鸟.... 昨天同学问到一个排列组合的问题,本身不会很难,原题是固定输入4个数字,例如1 2 3 4,输出所有可能的排列组合 暴力的话应该不难的.代码+debug,半个小时. 如果是输入N个数字呢? 先说简单的暴力方法,如果输入4个数字,输出所有的排列组合 代码比较短,也比较简单,没有很刻意的去把代码的风格写的好一点,所以数字常量什么的表介意.... /**********

排列组合或容斥原理

题目链接:https://vjudge.net/contest/237052#problem/H Here we go! Let's define the diversity of a list of numbers to be the difference between the largest and smallest number in the list. For example, the diversity of the list (1, -1, 2, 7) = 7 - (-1) = 8

HDU--5396(区间dp+排列组合)

做这道题的时候,想到会不会是dp,然后发现dp可做,但是一直被自己坑到死. 枚举最后合并的那个位置,然后对于加减号的,分成的前后两个部分都有不同的组合方法, (a1+a2........) +  (b1,b2.............)         对于每个a,被加b的个数的阶乘次 ,对于每个b,被加a的个数的阶乘次 减法同理 乘法特殊一点 (a1+a2........) *  (b1,b2.............)  乘法分配率,直接将两部分的总和相乘即可 想到这些还远远没有结束,因为最

排列组合

(常考)错位排列 有N封信和N个信封,每封信都不装在自己信封里的排列种数记作Dn,则 D1=0,D2=1,D3=2,D4=9,D5=44,D6=265 一.相邻问题---捆绑法 不邻问题---插空法 对于某几个元素不相邻的排列问题,可先将其他元素排好,再将不相邻元素在已排好的元素之间及两端空隙中插入即可. [例题1]一张节目表上原有3个节目,如果保持这3个节目的相对顺序不变,再添进去2个新节目,有多少种安排方法? A.20 B.12 C.6 D.4 [答案]A. [解析] 以下内容需要回复才能看