Codeforces 747F Igor and Interesting Numbers DP 组合数
题意:给你一个数n和t,问字母出现次数不超过t,第n小的16进制数是多少。
思路:容易联想到数位DP, 然而并不是。。。我们需要知道有多少位,在知道有多少位之后,用试填法找出答案。我们设dp[i][j]为考虑前i种字母,已经占了j个位置的方案数。那么dp[i][j] += dp[i - 1][j - k] * C[len - j + k][k],k的范围为[0, limit[k]]。意思是我们暴力枚举第i个字母放多少个,然后排列组合。
这个题有一个细节需要注意,因为最高为一定不为0,所以我们试填的时候可以直接把最高位为0的所有数提前减掉,然后试填的时候跳过最高位为0的情况。最高位为0的所有数在找多少位的时候顺便就算出来了。
代码:
- #include <bits/stdc++.h>
- #define LL long long
- using namespace std;
- int limit[20];
- LL C[20][20], dp[20][20];
- void out(int x) {
- if(x < 10) printf("%d", x);
- else printf("%c", x - 10 + 'a');
- }
- LL solve(int len, int flag) {
- if(len == 0) return 1;
- memset(dp, 0, sizeof(dp));
- for (int i = 0; i <= len && i <= limit[0]; i++)
- dp[0][i] = C[len][i];
- for (int i = 1; i < 16; i++)
- for (int j = 0; j <= len; j++) {
- for (int k = 0; k <= j && k <= limit[i]; k++) {
- dp[i][j] += dp[i - 1][j - k] * C[len - j + k][k];
- }
- }
- return dp[15][len];
- }
- int res[20];
- int main() {
- LL n, ans;
- int m;
- scanf("%lld%d", &n, &m);
- ans = n;
- for (int i = 0; i < 16; i++) limit[i] = m;
- for (int i = 0; i <= 15; i++) C[i][0] = 1;
- for (int i = 1; i <= 15; i++)
- for (int j = 1; j <= i; j++)
- C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
- int pos = -1;
- for (int i = 0; i >= 0; i++) {
- LL tmp = 0;
- for (int j = 1; j < 16; j++) {
- limit[j]--;
- tmp += solve(i, j);
- limit[j]++;
- if(tmp >= ans) {
- pos = i;
- break;
- }
- }
- if(tmp >= ans) break;
- else ans -= tmp;
- }
- n = ans;
- for (int i = pos; i >= 0 ; i--) {
- for (int j = 0; j < 16; j++) {
- if(i == pos && j == 0) continue;
- if(limit[j] == 0) continue;
- limit[j]--;
- LL tmp = solve(i, j);
- limit[j]++;
- if(tmp < n) {
- n -= tmp;
- } else {
- res[i] = j;
- limit[j]--;
- break;
- }
- }
- }
- for (int i = pos; i >= 0; i--) {
- out(res[i]);
- }
- printf("\n");
- }
Codeforces 747F Igor and Interesting Numbers DP 组合数的更多相关文章
- F. Igor and Interesting Numbers
http://codeforces.com/contest/747/problem/F cf #387 div2 problem f 非常好的一道题.看完题,然后就不知道怎么做,感觉是dp,但是不知道 ...
- CF747F Igor and Interesting Numbers
我佛了,这CF居然没有官方题解. 题意:给定k,t,求第k小的16进制数,满足每个数码的出现次数不超过t. 解: 每个数都有个出现次数限制,搞不倒.一开始想到了排序hash数位DP,不过写了写觉得不胜 ...
- 算法笔记_093:蓝桥杯练习 Problem S4: Interesting Numbers 加强版(Java)
目录 1 问题描述 2 解决方案 1 问题描述 Problem Description We call a number interesting, if and only if: 1. Its d ...
- java实现 蓝桥杯 算法提高 Problem S4: Interesting Numbers 加强版
1 问题描述 Problem Description We call a number interesting, if and only if: 1. Its digits consists of o ...
- ural 2070. Interesting Numbers
2070. Interesting Numbers Time limit: 2.0 secondMemory limit: 64 MB Nikolay and Asya investigate int ...
- Codeforces 385C Bear and Prime Numbers
题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...
- Codeforces 1109D. Sasha and Interesting Fact from Graph Theory
Codeforces 1109D. Sasha and Interesting Fact from Graph Theory 解题思路: 这题我根本不会做,是周指导带飞我. 首先对于当前已经有 \(m ...
- HDOJ(HDU).1058 Humble Numbers (DP)
HDOJ(HDU).1058 Humble Numbers (DP) 点我挑战题目 题意分析 水 代码总览 /* Title:HDOJ.1058 Author:pengwill Date:2017-2 ...
- noj 2033 一页书的书 [ dp + 组合数 ]
传送门 一页书的书 时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 53 测试通过 : 1 ...
随机推荐
- Mac 电脑如何卸载 重装node
由于在日常开发中,部分node版本不支持,因此,我们需要对已安装的node进行卸载重装,步骤如下: 一.在终端依次输入以下命令 sudo npm uninstall npm -g sudo r ...
- C# Aspose.Words 数据写入到word,模板样式复杂(转换指定内容并返回多张图片)
public ResultResponse<string[]> PrintStudyRecords([FromBody]StudyInfo info) { ResultResponse&l ...
- 2018-2-13-win10-uwp-绑定密码
title author date CreateTime categories win10 uwp 绑定密码 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17: ...
- java一个数组的内存图
- js 输入整数
1.我用 /^\+?[1-9][0-9]*$/ 貌似不对(小数也可以输入) 2.输入整数 n = /^[1-9]\d*$/; . -]\d*$/; //判断字符串是否为数字 if (!value) ...
- 解决分布式事务基本思想Base和CPA理论、最终一致性|刚性事务、柔性事务
在学习解决分布式事务基本思路之前,大家要熟悉一些基本解决分布式事务概念名词比如:CAP与Base理论.柔性事务与刚性事务.理解最终一致性思想,JTA+XA.两阶段与三阶段提交等. 如何保证强一致性呢? ...
- MariaDB 建立连接
与MariaDB建立连接的一种方法是在命令提示符下使用mysql二进制文件. MySQL脚本 查看下面给出的示例. [root@host]# mysql -u root -p Enter passwo ...
- 微信小程序点击顶部导航栏切换样式
类似这样的效果 <view class='helpCateList'> <!-- 类别 --> <scroll-view class='scroll-view' scro ...
- hdu 3974 Assign the task (线段树+树的遍历)
Description There is a company that has N employees(numbered from 1 to N),every employee in the comp ...
- 第七周-scrum meeting
第一部分ScrumMeeting 每个人的工作:其他人:(请填写自己的任务) 成员 任务 ISSUE链接 本周已完成的工作 本周计划完成的工作 工作中遇到的困难 关玉娇 负责登录注册界面的设计与实现 ...