[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 ...
随机推荐
- PHP file_put_contents()写入配置文件
php把提交的数据写入到配置文件中 在后台可以设置网站的基本信息,例如:title,keywords,copyright.等信息,这些信息只是一条数据,存入数据库耗费资源,直接写入到php文件中. 创 ...
- AWVS——自动化检测发现漏洞
AWVS简介 *AWVS作为一个工具,不可能把所有漏洞扫描出来,仅仅是作为一个渗透网站时的辅助工具 自动化Web漏洞扫描工具(基于漏洞匹配方法,通过网络爬虫测试网站安全) AWVS通过SQL注入攻击. ...
- 从数据库中读取数据并写入到Excle电子表格之2
//CC_AutoId, CC_LoginId, CC_LoginPassword, CC_UserName, CC_ErrorTimes, CC_LockDateTime, CC_TestInt ...
- go NewTicker 得使用
转载请注明出处: 在 Go 语言中,time.NewTicker 函数用于创建一个周期性触发的定时器.它会返回一个 time.Ticker 类型的值,该值包含一个通道 C,定时器会每隔一段时间向通道 ...
- 基于AidLux的自动驾驶智能预警应用方案
### 1. 自动驾驶感知算法及AidLux相关方案介绍 #### 1.1自动驾驶 自动驾驶汽车,又称无人驾驶车.电脑驾驶车.无人车.自驾车,是一种需要驾驶员辅助驾驶或者完全不需要操控的车辆.作为自动 ...
- 解决Pyonth读取 yaml文件的中文字体,报错UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe5
解决方法: 打开pycharm,点击files>setting 如下 改成UTF-8即可 改完后,之前的yaml文件里面的中文会出现乱码情况 删除后重写 即可
- 给SqlSugar一个优化建议
声明:本作者无恶意只是觉得这个功能很不错,平常工作当中经常用到,自己框架也做了相应的支持,本着技术共享目的. 一.对象组合设置列更新支持 建议度:高 业务场景 1.更新列表需统一设置 例如:修改人ID ...
- msvc C++编译链接
C++编译链接 C++编译链接 静态库编译 C RunTimeLibrary 链接过程 动态库编译 场景问题加深理解 总结 静态库编译 C RunTimeLibrary C++是C的超集,C RunT ...
- 2021-7-29 MySql的简单使用
创建表格 先判断users表是否存在,然后设置user_id为无符号(UNSIGNED)自动增长(AUTO_INCREMENT)的整型 并通过PRIMARY KEY设置user_id为主键 ENG ...
- 2021-3-9 excel导出
public void ExportExcel(DataTable dt) { //要添加epplus的nuget包 ExcelPackage.LicenseContext = LicenseCont ...