[ABC208E] Digit Products 题解
题目大意
求有多少个不大于 \(n\) 的正整数,使得该正整数各位乘积不大于 \(k\)。
思路分析
观察数据范围,首先考虑数位 DP。
考虑设计记忆化搜索函数 dfs(int pos,bool limit,bool lead0,int mul) 表示当前枚举到第 \(\text{pos}\) 位,第 \(\text{pos}\) 位是否受到限制,是否存在前导零,当前乘积为 \(\text{mul}\) 时的满足条件的数的个数。同时设 \(f_{\text{pos},\text{mul}}\) 表示在没有前导零,没有限制的条件下的记忆化数组。
然后分类讨论一下:
设当前枚举的数为 \(i\)。
当存在前导零,且 \(i=0\) 时,\(\text{mul}\) 不变。
当存在前导零,且 \(i\not =0\) 时,\(\text{mul}=i\)。
当不存在前导零时,\(\text{mul}=\text{mul}\times i\)。
然后套板子就可以了。
注意乘积的值域可能很大,但状态不会很多,因此 \(f\) 可以用 map 储存。
代码
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <map>
using namespace std;
const int N=20;
#define int long long
int n,k;
int a[N];
map<int,int> f[N];//使用 map 储存 f
int dfs(int pos,bool limit,bool lead0,int mul){
if(!pos) return mul<=k;//边界条件
if(!limit&&!lead0&&f[pos].count(mul))
return f[pos][mul];//记忆化
int up=limit?a[pos]:9,res=0;//上届
for(int i=0;i<=up;i++){
int tmp;
if(lead0&&i==0) tmp=mul;
else if(lead0&&i!=0) tmp=i;
else tmp=mul*i;//分类讨论
res+=dfs(pos-1,limit&&i==up,lead0&&i==0,tmp);//直接累加
}
if(!limit&&!lead0) f[pos][mul]=res;
return res;
}
int solve(int x){
int len=0;
while(x){//拆分数位
a[++len]=x%10;
x/=10;
}
return dfs(len,1,1,0);
}
signed main(){
scanf("%lld%lld",&n,&k);
cout<<solve(n)-1<<'\n';//注意 0 会被计算在内,需减去
return 0;
}
[ABC208E] Digit Products 题解的更多相关文章
- luoguP1118 [USACO06FEB]数字三角形`Backward Digit Su`… 题解
一上午都在做有关搜索的题目,,, 看到这题之后就直接开始爆搜 结果只有70分, 其余的点硬生生的就是那么WA了. 我的天哪~ 70分代码: #include<iostream> #incl ...
- 【题解】Digit Tree
[题解]Digit Tree CodeForces - 716E 呵呵以为是数据结构题然后是淀粉质还行... 题目就是给你一颗有边权的树,问你有多少路径,把路径上的数字顺次写出来,是\(m\)的倍数. ...
- 题解 UVA10212 【The Last Non-zero Digit.】
题目链接 这题在学长讲完之后和看完题解之后才明白函数怎么构造. 这题构造一个$f(n)$ $f(n)$ $=$ $n$除以 $2^{a}$ $*$ $5^{b}$ ,$a$ , $b$ 分别是 $n$ ...
- 题解报告:hdu 1060 Leftmost Digit
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1060 问题描述 给定一个正整数N,你应该输出N ^ N的最左边的数字. 输入 输入包含多个测试用例. ...
- 题解报告:hdu 1061 Rightmost Digit(快速幂取模)
Problem Description Given a positive integer N, you should output the most right digit of N^N. Input ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- HD1060Leftmost Digit
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission( ...
- 233. Number of Digit One
题目: Given an integer n, count the total number of digit 1 appearing in all non-negative integers les ...
- UVALive 7327 Digit Division (模拟)
Digit Division 题目链接: http://acm.hust.edu.cn/vjudge/contest/127407#problem/D Description We are given ...
- BZOJ3404: [Usaco2009 Open]Cow Digit Game又见数字游戏
3404: [Usaco2009 Open]Cow Digit Game又见数字游戏 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 47 Solved ...
随机推荐
- 【NestJS系列】从Nest CLI开始入门
初识Nest JS Nest 是一个渐进的 Node.js 框架,它可以在 TypeScript 和 JavaScript (ES6.ES7.ES8)之上构建高效.可伸缩的企业级服务器端应用程序. N ...
- EaselJS 源码分析系列--第二篇
在 第一篇 中我们大致分析了从: 创建舞台 -> 添加显示对象-> 更新显示对象 的源码实现 这一篇将主要分析几个常用显示对象自各 draw 方法的实现 让我们看向例子 examples/ ...
- Redis的设计与实现-总结
个人真的很喜欢这本书, 从对C语言一窍不通, 到发现C语言竟然如此简洁, 以至于我喜欢上了C! 对此前面的底层数据结构也读了几次, 大致整理了书里的内容, 后面的就粗略看了一下, 不再细细整理了. R ...
- Python日志模块:实战应用与最佳实践
本文详细解析了Python的logging模块,从基本介绍到实际应用和最佳实践.我们通过具体的代码示例解释了如何高效地使用这个模块进行日志记录,以及如何避免常见的陷阱,旨在帮助读者更好地掌握这个强大的 ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(10)- 从Serial NAND启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1xxx系列MCU的Serial NAND启动. 最近越来越多的客户在咨询 i.MXRT1xxx 从 Serial N ...
- MyBatis使用注解开发(及Sqlsession连接器的本质)
使用注解开发 底层实现机制是反射和,动态代码.反射可以获得这个类的方法属性还可以创建对象,执行方法. 面向接口编程 之前学过,面向对象编程,也学习过接口.但是真正的开发中,很多时候我们会选择面向接口编 ...
- 微信小程序+web数据库的开发实践
前言 生活中使用微信小程序的场景越来越多,它实现了用户对于应用"触手可及.用完即走"的理想需求.微信小程序的开发难度也低于APP的开发制作,使用它会更便利.低成本.高经济效益. 但 ...
- 王道oj/problem10
地址:http://oj.lgwenda.com/problem/10 思路:首先创建字符串赋初值,其次用gets()输入字符串[fgets()相对于gets()会多识别"\n", ...
- VScode 中golang 单元测试,解决单元测试超时timeout30s
目的:单元测试的主要目的是验证代码的每个单元(函数.方法)是否按照预期工作. 提示:解决单元测试超时30s的问题在序号4 1 准备以_test.go结尾文件和导入testing包 在命名文件时需要让文 ...
- OpenLayers文档
https://openlayers.org/en/latest/apidoc/module-ol_interaction_DragZoom-DragZoom.html#changed