我佛了,这CF居然没有官方题解。

题意:给定k,t,求第k小的16进制数,满足每个数码的出现次数不超过t。

解:

每个数都有个出现次数限制,搞不倒。一开始想到了排序hash数位DP,不过写了写觉得不胜其烦,就弃疗了。

但是思考一下,如果我们知道了每个数的出现次数和数的位数,那么一次普通DP就能够求出方案数。

所以我们暴力做多次这种普通DP即可......

具体来说,分为带前导0和不带前导0两个DP函数。

首先枚举数的长度,计算不带前导0的个数。如果不到k就减去。

然后知道了长度,再一位一位的确定。在每一位上枚举放哪个数码。如果方案数不足就减去这么多。

对于那个DP函数,状态设计f[i][j]表示用前i个数码放j位的数的方案数。转移就是

f[i][j] = f[i - 1][j - k] * C(j, k),表示在j个位置中选出k个放数码i,剩下的放前面的数码,前面的数码相对位置不变。

 #include <cstdio>
#include <cstring>
#include <algorithm> typedef long long LL;
const int N = , B = ; LL f[][N], C[N][N], choose[N];
int rest[B]; inline LL DP(int n) { // with leading zero
if(n <= ) {
return ;
}
memset(f, , sizeof(f));
for(int i = ; i <= B; i++) {
f[i - ][] = ;
for(int j = ; j <= n; j++) {
for(int k = ; k <= rest[i - ] && k <= j; k++) {
f[i][j] += f[i - ][j - k] * C[j][k];
}
}
} return f[][n];
} inline LL DP1(int n) { // no leading zero
LL ans = ;
for(int i = ; i < B; i++) {
if(rest[i]) {
rest[i]--;
ans += DP(n - );
rest[i]++;
}
}
return ans;
} int main() {
for(int i = ; i < ; i++) {
C[i][] = C[i][i] = ;
for(int j = ; j < i; j++) {
C[i][j] = C[i - ][j] + C[i - ][j - ];
}
}
int t;
LL k;
scanf("%lld%d", &k, &t);
int len;
for(len = ; ; len++) {
for(int i = ; i < B; i++) {
rest[i] = t;
}
LL temp = DP1(len);
if(temp >= k) {
break;
}
k -= temp;
} for(int i = ; i < B; i++) {
rest[i] = t;
}
for(int i = len; i >= ; i--) {
for(int j = (i == len); j < B; j++) {
if(!rest[j]) {
continue;
}
rest[j]--;
LL temp = DP(i - );
if(temp < k) {
k -= temp;
rest[j]++;
}
else {
choose[i] = j;
break;
}
}
} for(int i = len; i >= ; i--) {
if(choose[i] < ) {
printf("%d", choose[i]);
}
else {
putchar('a' + choose[i] - );
}
}
return ;
}

AC代码

CF747F Igor and Interesting Numbers的更多相关文章

  1. F. Igor and Interesting Numbers

    http://codeforces.com/contest/747/problem/F cf #387 div2 problem f 非常好的一道题.看完题,然后就不知道怎么做,感觉是dp,但是不知道 ...

  2. Codeforces 747F Igor and Interesting Numbers DP 组合数

    题意:给你一个数n和t,问字母出现次数不超过t,第n小的16进制数是多少. 思路:容易联想到数位DP, 然而并不是...我们需要知道有多少位,在知道有多少位之后,用试填法找出答案.我们设dp[i][j ...

  3. ural 2070. Interesting Numbers

    2070. Interesting Numbers Time limit: 2.0 secondMemory limit: 64 MB Nikolay and Asya investigate int ...

  4. 算法笔记_093:蓝桥杯练习 Problem S4: Interesting Numbers 加强版(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 Problem Description We call a number interesting, if and only if: 1. Its d ...

  5. java实现 蓝桥杯 算法提高 Problem S4: Interesting Numbers 加强版

    1 问题描述 Problem Description We call a number interesting, if and only if: 1. Its digits consists of o ...

  6. URAL 2070 Interesting Numbers (找规律)

    题意:在[L, R]之间求:x是个素数,因子个数是素数,同时满足两个条件,或者同时不满足两个条件的数的个数. 析:很明显所有的素数,因数都是2,是素数,所以我们只要算不是素数但因子是素数的数目就好,然 ...

  7. 【线性筛】【筛法求素数】【约数个数定理】URAL - 2070 - Interesting Numbers

    素数必然符合题意. 对于合数,如若它是某个素数x的k次方(k为某个素数y减去1),一定不符合题意.只需找出这些数. 由约数个数定理,其他合数一定符合题意. 就从小到大枚举素数,然后把它的素数-1次方都 ...

  8. Ural 2070:Interesting Numbers(思维)

    http://acm.timus.ru/problem.aspx?space=1&num=2070 题意:A认为如果某个数为质数的话,该数字是有趣的.B认为如果某个数它分解得到的因子数目是素数 ...

  9. HDU 6659 Acesrc and Good Numbers (数学 思维)

    2019 杭电多校 8 1003 题目链接:HDU 6659 比赛链接:2019 Multi-University Training Contest 8 Problem Description Ace ...

随机推荐

  1. 【学亮IT手记】PL/SQL游标编程

    游标提供了一种从表中检索数据并进行操作的灵活手段,主要用在服务器上,处理由客户端发送给服务器端的sql语句,或者是批处理.存储过程.触发器中的数据处理请求. 显式游标 是由用户声明和操作的一种游标,通 ...

  2. 命名自我规约manual

    前端: 所有文件命名都小写,多个单词连接使用 “-” 变量命名规则还是驼峰式,或者在前面加个 “_” SQL: MySQL: 所有命名都小写,无论库.表.还是字段等等,都小写 多个单词之间的分隔,使用 ...

  3. iis7.0 发生未知 FastCGI错误,错误代码 0x8007010b 的解决办法

    错误提示 修改该网站所对应的应用程序池 进程模型->标识 修改为:LocalSystem

  4. vue 使用技巧总结 19.01

    组件中箭头函数的使用 不要使用箭头来定义任意生命周期钩子函数: 不要使用箭头来定义一个 methods 函数: 不要使用箭头来定义 computed 里的函数: 不要使用箭头定义 watch 里的函数 ...

  5. Essential Phone刷机教程

    安装fastboot驱动(Essential-PH1-WindowsDrivers) 下载ADB刷机指令工具:platform-tools(ADB): 进入开发者选项,打开 USB 调试,OEM解锁选 ...

  6. 扒一扒开源世界有哪些licenses?

    摘要:license,中文译为“许可证”.在开源世界里,license是具有法律效力的,通过选择相应的license,版权拥有者可以声称自己相应的权利,包括其他人使用.修改.引用.共享等一系列涉及版权 ...

  7. 工厂类,配置文件,静态方法,反射构成编译器解耦;ioc的一个概念 ;通过xml创建容器里面存储对象

    工厂类,配置文件,静态,反射方法构成编译器解耦;ioc的一个概念

  8. Element UI 中组件this.$message报错

    最近在做毕设的时候,用Element UI中的消息提示message一直报以下的错误: 展示的效果也不好看,没有图标什么的: 但我明明有在main.js引入了element-ui 呀,因为毕设时间很赶 ...

  9. Codeforces Round #505 Div. 1 + Div. 2

    传送门:>Here< 从来没打过\(CF\)(由于太晚了)-- 不知道开学了以后有没有机会能够熬夜打几场,毕竟到现在为止都是\(unrated\)好尴尬啊~ 今天早上打了几题前几天的比赛题 ...

  10. 慢腾腾的Quartus prime16.0加快编译速度

    前言 当一个工程反复修改的时候,可能有时候源代码没有更改,为了加快编译速度可以配置quartus一些选项.当然,初次编译的速度是否会提升,未验证.更高级的设计分区以及逻辑锁区提升速度,以后阐述. 流程 ...