CF747F Igor and Interesting Numbers
我佛了,这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的更多相关文章
- F. Igor and Interesting Numbers
http://codeforces.com/contest/747/problem/F cf #387 div2 problem f 非常好的一道题.看完题,然后就不知道怎么做,感觉是dp,但是不知道 ...
- Codeforces 747F Igor and Interesting Numbers DP 组合数
题意:给你一个数n和t,问字母出现次数不超过t,第n小的16进制数是多少. 思路:容易联想到数位DP, 然而并不是...我们需要知道有多少位,在知道有多少位之后,用试填法找出答案.我们设dp[i][j ...
- ural 2070. Interesting Numbers
2070. Interesting Numbers Time limit: 2.0 secondMemory limit: 64 MB Nikolay and Asya investigate int ...
- 算法笔记_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 (找规律)
题意:在[L, R]之间求:x是个素数,因子个数是素数,同时满足两个条件,或者同时不满足两个条件的数的个数. 析:很明显所有的素数,因数都是2,是素数,所以我们只要算不是素数但因子是素数的数目就好,然 ...
- 【线性筛】【筛法求素数】【约数个数定理】URAL - 2070 - Interesting Numbers
素数必然符合题意. 对于合数,如若它是某个素数x的k次方(k为某个素数y减去1),一定不符合题意.只需找出这些数. 由约数个数定理,其他合数一定符合题意. 就从小到大枚举素数,然后把它的素数-1次方都 ...
- Ural 2070:Interesting Numbers(思维)
http://acm.timus.ru/problem.aspx?space=1&num=2070 题意:A认为如果某个数为质数的话,该数字是有趣的.B认为如果某个数它分解得到的因子数目是素数 ...
- HDU 6659 Acesrc and Good Numbers (数学 思维)
2019 杭电多校 8 1003 题目链接:HDU 6659 比赛链接:2019 Multi-University Training Contest 8 Problem Description Ace ...
随机推荐
- MT4用EA测试历史数据时日志出现:stopped because of stop out
今天用嘉盛的MT4测试一个EA,谁知道才走了十几天数据就完 了,看结果本金也没亏完啊,才亏了一半,而且我测的是1年的时间. 查看日志一有条警告:stopped because of stop out, ...
- springboot No Identifier specified for entity的解决办法
今天在做一个项目的时候遇到一个问题,实体类忘了指定主键id,然后报如下错误,也是自己粗心大意造成的,在此记录下. java.lang.IllegalStateException: Failed to ...
- qtp自动化测试-条件语句 if select case
1 if 语句 if condition then end if If condition Then [statements] [ElseIf condition-n Then [else ...
- qtp 自动化测试---点滴 获取属性性/修改窗体标题
1 GetROProperty获取对应属性值 value url (这里出错了) If Window("新增").WinObject("TRzDBEdit_10" ...
- vi简短教程
1.模式 命令行模式:光标的移动.内容删除移动复制操作 插入模式:文字输入,即编辑状态 底行模式:文件保存或退出vi,设置编辑环境 2.基本操作 vi myfile,输入vi 文件名,则进入vi. 3 ...
- Nginx 返回响应过滤响应内容
陶辉94课 过滤模块 从下到上顺序 ngx_http_proxy_module 模块 Syntax: proxy_ignore_headers field ...; Default: — Contex ...
- mysql 测试php连接问题
<?php$servername = "shuhua.dbhost";$username = "shuhua_user";$password = &quo ...
- Dirichlet's Theorem on Arithmetic Progressions POJ - 3006 线性欧拉筛
题意 给出a d n 给出数列 a,a+d,a+2d,a+3d......a+kd 问第n个数是几 保证答案不溢出 直接线性筛模拟即可 #include<cstdio> #inclu ...
- 大学jsp实验4include,forword
一.实验目的与要求 1.掌握常用JSP动作标记的使用. 二.实验内容 1.include动作标记的使用 编写一个名为shiyan4_1.jsp的JSP页面,页面内容自定,但要求使用include动作标 ...
- POJ 3322 Bloxorz(算竞进阶习题)
bfs 标准广搜题,主要是把每一步可能的坐标都先预处理出来,会好写很多 每个状态对应三个限制条件,x坐标.y坐标.lie=0表示直立在(x,y),lie=1表示横着躺,左半边在(x,y),lie=2表 ...