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 ...
随机推荐
- 如何消除原生Android网络状态上的惊叹号
喜欢使用原生Android系统的朋友可能会发现自己的状态栏信号图标上经常有一个惊叹号标志. 这是怎么回事呢?原因是Android为了对网络状态进行检测,采用了一种叫做captive detection ...
- [开源 .NET 跨平台 Crawler 数据采集 爬虫框架: DotnetSpider] [一] 初衷与架构设计
[DotnetSpider 系列目录] 一.初衷与架构设计 二.基本使用 三.配置式爬虫 四.JSON数据解析与配置系统 五.如何做全站采集 为什么要造轮子 同学们可以去各大招聘网站查看一下爬虫工程师 ...
- DatasourceUtils类:获取连接池和数据库连接
本工具类用于获取连接池和数据库连接 package com.itheima.utils; import java.sql.Connection; import java.sql.ResultSet; ...
- java web 开发入门 --- tomcat/servlet/jsp
在做java web 开发时,要先安装tomcat.它是一个web服务器,也叫web容器,我们把写好的jsp, html页面放到它里面,然后启动它,就可以用浏览器访问这些页面,地址栏中输入localh ...
- M3U8文件
M3U本质上说不是音频文件,它是音频文件的列表文件,是纯文本文件.你下载下来打开它,播放软件并不是播放它,而是根据它的记录找到网络地址进行在线播放. M3U文件的大小很小,也就是因为它里面没有任何音频 ...
- Xml的用途
1.可以作为数据库存储数据--通过XML文件存储数据,可以通过javaScript读取外部的XML文件,然后更新HTML的数据内容 2.XML数据以纯文本格式进行存储,提供了独立于软件和硬件的数据存储 ...
- C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)
参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...
- 2010 SD - ICPC D - Emergency
D - Emergency Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit ...
- 【luogu3733】【HAOI2017】 八纵八横 (线段树分治+线性基)
Descroption 原题链接 给你一个\(n\)个点的图,有重边有自环保证连通,最开始有\(m\)条固定的边,要求你支持加边删边改边(均不涉及最初的\(m\)条边),每一次操作都求出图中经过\(1 ...
- Nowcoder | [题解-N189]牛客OI赛制测试赛3
这场说实话确实水(逃*1),表示差一点就AK了(逃*2),然而被卡两个特判的我\(ssfd\)...\(qwq\) 表示这是第一次发整场比赛的题解...还请各位大佬原谅我太蒻写的垃圾啊\(qwq\). ...