hihocoder 编程练习赛23
第一题:H国的身份证号码I
题意:一个N位的正整数(首位不能是0)。每位数字都小于等于K,并且任意相邻两位数字的乘积也小于等于K。按从小到大的顺序输出所有合法的N位号码,每个号码占一行。
思路:dfs
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 20;
#define LL long long
int n, k, a[N]; void dfs(int pos)
{
if (pos == n + 1){
for (int i = 1; i <= n; i++) printf("%d", a[i]);
puts("");
return;
}
if (pos == 1){
for (int i = 1; i <= k; i++){
a[pos] = i; dfs(pos + 1);
}
}
else{
for (int i = 0; i <= k; i++){
if (i * a[pos - 1] <= k){
a[pos] = i;
dfs(pos + 1);
}
}
}
} int main()
{
while (~scanf("%d%d", &n, &k)){
dfs(1);
}
return 0;
}
第二题:合并子目录
题意:小Hi发现其中一些子目录只包含另一个子目录,例如/hihocoder/offer22只包含一个子目录solution,/game只包含一个子目录moba,而moba也只包含一个子目录dota2。小Hi决定把这样的子目录合并成一个子目录,并且将被合并的子目录的名字用'-'连起来作为新子目录的名字。
思路:map数组记录前缀,num 数组记录节点孩子个数
mop[fa][ss] //fa表示前缀序列编号,ss为当前目录
代码:
#include<stdio.h>
#include<string.h>
#include<map>
#include<vector>
#include<string>
#include<iostream>
using namespace std;
const int N = 5e5 + 10;
typedef long long LL; int id, n, fa, num[N];
map<string, int> mop[N];
char s[N]; string ss;
map<int, string> st;
vector<int> a[N]; int main()
{
while (~scanf("%d", &n)){
id = 0;
for (int i = 1; i <= n; i++){
scanf("%s", s);
fa = 0;
int len = strlen(s); ss = ""; s[len] = '/';
for (int j = 1; j <= len; j++){
if (s[j] == '/'){
if (mop[fa][ss] == 0){
mop[fa][ss] = ++id;
num[fa] ++; // 儿子个数
}
st[mop[fa][ss]] = ss;
fa = mop[fa][ss];
a[i].push_back(fa);
ss = "";
}
else{
ss += s[j];
}
}
}
for (int i = 1; i <= n; i++){
printf("/");
int size = a[i].size() - 1;
num[a[i][size - 1]] ++;
for (int j = 0; j < a[i].size() - 1; j++){
cout << st[a[i][j]];
if (num[a[i][j]] > 1) printf("/");
else printf("-");
}
cout << st[a[i][size]] << endl;
}
}
return 0;
}
第三题:H国的身份证号码II
题意:第一题的扩展,对于100%的数据,1 ≤ N ≤ 1012,1 ≤ K ≤ 81,输出合法号码的总数。由于答案可能非常大,你只需要输出答案对109+7取模的结果。
思路:数位dp, 矩阵操作
f[i][j]:第一维表示位数,第二维表示目前的数字,值表示第 i 位为 j 时符合条件的总个数。

#include<stdio.h>
#include<string.h>
#include<map>
#include<vector>
#include<string>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
const int N = 10 + 10, Z = 1e9 + 7;
typedef long long LL;
#define ms(x, y) memset(x, y, sizeof(x))
#define mc(x, y) memcpy(x, y, sizeof(x)) struct matrix
{
LL v[N][N];
void O(){ ms(v, 0); }; //得到零矩阵
void E(){ ms(v, 0); for (int i = 0; i < 10; i++) v[i][i] = 1; } //得到单位矩阵
matrix operator *(const matrix &b){ //乘法
matrix c;
c.O();
for (int k = 0; k < 10; k++){
for (int i = 0; i < 10; i++){
for (int j = 0; j < 10; j++){
c.v[i][j] = (c.v[i][j] + v[i][k] * b.v[k][j]) % Z;
}
}
}
return c;
}
matrix operator ^(LL p){ //快速幂
matrix x, y;
x.E();
mc(y.v, v);
while (p){
if (p & 1) x = x * y;
p >>= 1;
y = y * y;
}
return x;
}
}a, b; LL n;
int k; int main()
{
while (~scanf("%lld%d", &n, &k)){
ms(a.v, 0); ms(b.v, 0);
int top = min(9, k);
for (int i = 1; i <= top; i++) a.v[0][i] = 1;
for (int i = 0; i <= top; i++){
for (int j = 0; j <= top; j++){
if (i * j <= k) b.v[i][j] = 1;
}
}
b = b ^ (n - 1);
a = a * b;
int ans = 0;
for (int i = 0; i <= top; i++) ans = (ans + a.v[0][i]) % Z;
printf("%d\n", ans);
}
return 0;
}
第四题:观光旅行
题意:
思路:
hihocoder 编程练习赛23的更多相关文章
- hihocoder编程练习赛75
题目1 : 工作城市分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 H公司在北京和上海两个城市各有一间办公室.该公司最近新招募了2N名员工,小Hi负责把这2N名员工 ...
- hihoCoder编程练习赛72
题目1 : 玩具设计师 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho作为Z国知名玩具品牌AKIRE的首席设计师,对玩具零件的挑剔程度已经到了叹为观止的地步.所有 ...
- hihoCoder编程练习赛70
题目1 : 数位翻转 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 n,你可以进行若干次操作,每次操作可以翻转 n 的二进制表示下的某一位,即将 0 变成 ...
- hihoCoder编程练习赛69
题目1 : 偶数长度回文子串 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个小写字母字符串,请判断它是否有长度为偶数的非空连续回文子串 输入 输入包含多组数据. ...
- hihoCoder编程练习赛67
题目1 : 序列 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定两个正整数 n, P,求满足以下两个条件的长度为 n 的序列 ai 个数: 1. 1 ≤ ai ≤ ...
- hihoCoder编程练习赛52
题目1 : 字符串排序 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 一般我们在对字符串排序时,都会按照字典序排序.当字符串只包含小写字母时,相当于按字母表" ...
- hihoCoder编程练习赛49
题目1 : 相似颜色 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在CSS中我们可以用井号(#)加6位十六进制数表示一种颜色,例如#000000是黑色,#ff0000 ...
- hihocoder编程练习赛91:相邻字符串
题目链接 给定一个长度小于1e5的字符串s,s中字符全是大写英语字母.现在要寻找s中有多少组邻近的"hio"字符串,邻近的定义如下:hi距离+io距离+ho距离小于k.输入k和s, ...
- 【hihocoder编程练习赛9】闰秒
题目链接 #include<stdio.h> #include<string.h> #include<algorithm> #include<math.h&g ...
随机推荐
- centos7安装minikube
安装之前需要在bios中开启虚拟化功能.这里是在vmvare虚拟机中安装.开启步骤如下: 下载virtualbox 官网地址:https://www.virtualbox.org/ [virtualb ...
- UVALive - 7139(差分+模拟)
题目链接 参考 题意 N*M的网格,一辆车沿着网格线按给定路线走,每个网格里有一个人,人的视线始终看着车,问这些人净转圈数的平方和. 分析 由于车的起点和终点都为左上角,且每个格子里的人永远面对着车, ...
- B树学习总结
1,B树的基本介绍 ①B树,相比于二叉树.红黑树而言,它的特点就是树的高度比其他类型的树要低很多.如何做到低呢?B树中的每个结点的分支数目非常大,即每个结点有很多很多孩子结点.这样,在相同结点数目情况 ...
- python(nmap模块、多线程模块)
http://xael.org/pages/python-nmap-en.html nmap模块 http://www.tutorialspoint.com/python/python_m ...
- OpenCV入门(1)- 简介
1.图像的表示 在计算机看来,图像只是一些亮度各异的点,一副M*N的图片可以用M*N的矩阵来表示,矩阵的值表示这个位置上像素的亮度. 一般灰度图用二维矩阵来表示,彩色(多通道)图用三维矩阵表示,大部分 ...
- 第16月第10天 poco target
1. void TCPServer::start() { poco_assert (_stopped); _stopped = false; _thread.start(*this); } void ...
- yo install generator-gulp-react遇到UNMET PEER DEPENDENCY问题
最近在用yeoman下载下来的框架配置react环境 yo install generator-gulp-react安装框架包 遇到了 UNMET PEER DEPENDENCY问题 找不到依赖的gu ...
- 一个极好的JavaScript学习网址
JavaScript学习网址:https://javascript.info/ 网址界面如下,内容和排版都非常不错,内容也比较新,不像一些教程已经是好几年前的了.把这个教程浏览一遍,能够解答很多看代码 ...
- 2018-2019-2 《网络对抗技术》Exp0 Kali安装 20165230
2018-2019-2 <网络对抗技术>Exp0 Kali安装 20165230 一.下载kali 下载地址 下载Kali Linux 64 bit VMware VM版本 下载vmwar ...
- 使用Groovy的sql模块操作mysql进行多种查询
连接数据库,这里要创建一个sql实例来操作数据库,必须加载jdbc驱动包,使用两个注解,否则会报错: import groovy.sql.Sql url='jdbc:mysql://localhost ...