[POJ 1715] Hexadecimal Numbers 求排列数/数位DP
来源:互联网 发布:form表单转json 编辑:程序博客网 时间:2024/06/08 01:14
题目传送门:【POJ 1715】
题目大意: 输入一个正整数 n,求第 n 大的不超过 8 位的各位数字不同的 16 进制数。注意,最后得到的 16 进制数不含前导 0(即:前面的 0 可以重复)。保证输入合法。
样例输入:11
样例输出:FEDCBA87
题目分析: (mmp浪费时间浪费生命的辣鸡排列组合题,又耗我一下午)
由题,这道题看起来可以根据 n 与每一位数的关系暴力求出每一位数的值,但这样做十分不方便,特别是最后判前导 0 的时候很不好写,所以不推荐这样做(不过我 AC 了,100 行+,不在这里贴出来)
如果想看更详细的,这里参考了 Hacker_vision的题解。
首先我们先要求出这个 n 能达到的那个数的字符串长度。
然后我们对每一位数进行枚举,求出符合的最大的数 ( 0 - F ),同时输出这一位数代表的 0-F 即可。这里需要用到排列的性质。
至于为什么说是数位DP呢……因为这道题是对每一位数进行处理……所以就是数位DP了……妙不妙……
下面附上代码:
- #include<cstdio>
- const char hexa[17]=“0123456789ABCDEF”;
- long long tot[10],f[17]; //tot[i]:i位数的总方案数
- int n,len;
- bool used[17]; //记录这个数字(0-F)是否被使用
- void fac(){ //阶乘,求排列用
- f[0]=1;
- for (int i=1;i<=15;i++) f[i]=f[i-1]*i;
- }
- long long A(int a,int b){return f[a]/f[a-b];}
- void preprocess(){
- fac();
- for (int i=8;i>0;i–)
- tot[i]=tot[i+1]+A(15,i-1)*15;
- tot[1]++; //仅含 0
- }
- int main(){
- preprocess();
- scanf(”%d”,&n);
- for (len=8;len>0;len–) if (n<=tot[len]) break;
- long long left=n-tot[len+1]; //left:剩余数的数量
- for (int i=len;i>0;i–){
- for (int k=15;k>=0;k–){ //枚举这个数(0-F)能不能填
- if (used[k]) continue;
- long long tmp=A(15-len+i,i-1);
- if (left<=tmp){ //剩余的数不多于tmp,直接选
- printf(”%c”,hexa[k]);
- used[k]=true;
- break;
- }
- left-=tmp;
- }
- }
- return 0;
- }
阅读全文
1 0
- [POJ 1715] Hexadecimal Numbers 求排列数/数位DP
- 排列数递归调用:poj 1715 Hexadecimal Numbers
- POJ 1715 Hexadecimal Numbers
- POJ 1715 Hexadecimal Numbers 笔记
- 【数位DP】Round Numbers POJ
- POJ 1715 Hexadecimal Numbers 组合数学
- POJ 1715- Hexadecimal Numbers(组合数学)
- POJ 3252 Round Numbers 数位DP
- poj 3252 Round Numbers (数位DP)
- poj 3252 Round Numbers(数位dp)
- POJ 3252 Round Numbers (数位DP)
- poj 3252 Round Numbers(数位dp)
- Round Numbers - POJ 3252 数位dp
- 【数位DP】【poj 3252】Round Numbers
- poj 3252 Round Numbers 数位dp
- POJ 3252 Round Numbers (数位DP)
- POJ 3252 round numbers(数位DP)
- 【数位DP】POJ 3252 Round Numbers
- linux命令
- (总结)Oracle 11g常用管理命令(用户、表空间、权限)
- PD4ML Cookbook PDF and True Type fonts(2)
- 微信小程序将图片数据流添加到image标签中
- JavaWeb中读取文件资源的路径问题
- [POJ 1715] Hexadecimal Numbers 求排列数/数位DP
- referrer属性(获取本页的URL,上一页URL)
- 文章标题
- java基础-------重载(Overload)和重写的区别(Override)
- WIFI DFS测试介绍
- 华硕笔记本BIOS设置禁用UEFI后使用U盘装系统方法
- jvm内存模型及类加载器
- lvs-tun 配置
- Extjs-入门