Codeforces Round #387 (Div. 2) 747F(数位DP)
题目大意
给出整数k和t,需要产生一个满足以下要求的第k个十六进制数
即十六进制数每一位上的数出现的次数不超过t
首先我们先这样考虑,如果给你了0~f每个数字可以使用的次数num[i],如何求长度为L且满足要求的十六进制数有多少个
dp[i][l]表示使用了前i个数字,已经将L的空位填上了l个的数有多少个
转移方程 dp[i][l] = sigma(dp[i-1][l-j]*C[len-l+j[j]) 其中j是枚举填新的数的个数,C是组合数(选出j个空位填上新数)
有了这个dp后,现在的问题就变成了找出第k个数
首先先确定位数,枚举位数,然后就可以找到第k个数的位数是多少
然后对从最高位开始枚举,确定每一位应该是多少
最后就可以得出答案
#include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long LL; const int maxl = 200; LL C[maxl][maxl], dp[16][maxl]; int num[16], t; LL k; void prepare() {for(int i = 0; i < maxl; i++) C[i][0] = 1;for(int i = 1; i < maxl; i++)for(int j = 1; j <= i; j++)C[i][j] = C[i-1][j] + C[i-1][j-1]; }LL solve(int len) {memset(dp, 0, sizeof(dp));for(int i = 0; i <= num[0]; i++) dp[0][i] = C[len][i];for(int i = 1; i < 16; i++)for(int l = 0; l <= len; l++)for(int j = 0; j <= min(num[i], l); j++)dp[i][l] += dp[i-1][l-j]*C[len-l+j][j];return dp[15][len]; } void print(int j) {if(j < 10) cout<<j;else cout<<(char)(j+'a'-10); } int main() {prepare();cin>>k>>t;for(int i = 0; i < 16; i++) num[i] = t;int len = 1;for(;; len++){LL tmp = 0;if(len == 1) tmp = 15;elsefor(int j = 1; j < 16; j++){num[j]--;tmp += solve(len-1);num[j]++;}if(k > tmp) k -= tmp;else break;}for(int i = len; i > 0; i--){if(i == 1){for(int j = 0; j < 16; j++){if(j == 0 && len == 1) continue;if(num[j] != 0) k--;if(k == 0) { print(j); break; }}break;}for(int j = 0; j < 16; j++){if(i == len && j == 0) continue;num[j]--;LL tmp = solve(i-1);if(k > tmp) k -= tmp;else{print(j);break;}num[j]++;}} }
转载于:https://www.cnblogs.com/Saurus/p/6208757.html
Codeforces Round #387 (Div. 2) 747F(数位DP)相关推荐
- Educational Codeforces Round 8 D. Magic Numbers 数位DP
D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...
- Codeforces Round #131 (Div. 2) B. Hometask dp
题目链接: http://codeforces.com/problemset/problem/214/B Hometask time limit per test:2 secondsmemory li ...
- Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS
题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...
- Codeforces Round #374 (Div. 2) C. Journey DP
C. Journey 题目连接: http://codeforces.com/contest/721/problem/C Description Recently Irina arrived to o ...
- Codeforces Round #260 (Div. 1) A - Boredom DP
点击打开链接 题意: 给你n个数,你每次可以选择删除去一个数x,但是等于x+1和等于x-1的数都得删去 你每一次操作可以得x分 思路一: dp[i]表示到i后能够得到的最大分数 dp[i]=max(d ...
- Codeforces Round #387 (Div. 2) A+B+C+D!
A. Display Size 水题,暴力(数据都是水题).0:04 int main() {int n;while(~scanf("%d",&n)){int mi=n;i ...
- Codeforces Round #268 (Div. 1) C. Hack it! 数位dp + 构造数位
传送门 文章目录 题意: 思路: 题意: 定义f(x)f(x)f(x)表示xxx的十进制下数位和,现在给你aaa,让你选一个区间[l,r][l,r][l,r],满足∑i=lrf(i)moda=0\su ...
- Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...
- Codeforces Round #459 (Div. 2) C 思维,贪心 D 记忆化dp
Codeforces Round #459 (Div. 2) C. The Monster 题意:定义正确的括号串,是能够全部匹配的左右括号串. 给出一个字符串,有 (.). ? 三种字符, ? 可以 ...
最新文章
- Access和CorelDRAW总结
- find name 模糊匹配_MYSQL关于find_in_set()函数的使用详解和like的区别之处
- 【论文解读】基于图卷积的价格感知推荐
- NumPy中的where()函数
- 咋样查mysql的url_eclipse用jdbc连接mysql数据库时,url是填什么?怎样找出地址?
- 测试题的答案(技术博客)
- mysql冷热数据LRU_浅析MySQL的lru链表
- python包导入详细教程脚本之家_python包导入详细教程脚本之家_Python使用import导入本地脚本及导入模块的技巧总结......
- 《深入浅出DPDK》学习思维导图
- javascript Date对象
- 如何安全地终止线程interrupt()、isInterrupted()、interrupted()的区别与使用
- android http上传,Android HttpClient上传文件(亲测,成功)
- MSVAR能用MATLAB做吗,MS-VAR模型(MSVAR)建模心得(干货)
- 计算机内存128毫升,内存换算公式(内存怎么换算)
- 一文读懂图像局部特征点检测算法!
- 安科瑞电气系统Acrel-2000在数据中心机房的应用及产品选型
- k8s命令对node调度 cordon,drain,delete 区别
- 如何构建企业内的 TiDB 自运维体系
- 大厂app出海攻略|一个方法让app推广变现能力双效提升
- JAVA —— 就业面面案例①(WEB综合案例)
热门文章
- 计算机关机键消失了,如何解决Windows7电脑中的关机键不见了
- php长按图片保存mui,Vue+mui实现图片的本地缓存
- 更改ftp服务器根文件夹,ftp服务器的主目录根文件夹
- Hibernate基于Maven入门实例,与MyBatis比对
- Weblogic Server 的下载,安装配置与部署
- java 代码压缩javascript_利用Java来压缩 JavaScript 代码详解
- flutter 微信语言选择_flutter实战项目,教你使用flutter打造微信app页面!
- 二维矩阵边界包围JAVA_Quart 2D 绘制图形简单总结
- datagrid传参_DataGrid里面要传两个参数怎么传
- UVALive - 6440