P2602 [ZJOI2010] 数字计数:数位DP
https://www.luogu.com.cn/problem/P2602
// #include <iostream>
// #include <iomanip>
// #include <unistd.h>
// #include <climits>
// #include <string>
// #include <stdlib.h>
// #include <cstdio>
// #include <fcntl.h>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
typedef long long ll;
ll num(vector<int>& data, int pos)
{
ll t = 0;
while(pos >= 0)
{
t *= 10;
t += data[pos--];
}
return t;
}
ll dfs(vector<vector<vector<ll>>>& dp,
vector<int>& data, int pos, int x, bool limit, bool zero)
{
if(pos == -1) //没有数字,贡献x零次
return 0;
if(dp[pos][limit][zero] != -1)
return dp[pos][limit][zero];
int up = limit ? data[pos] : 9;
ll ret = 0;
for(int i = 0; i<=up; ++i)
{
ret += dfs(dp, data, pos-1, x, limit&&i==data[pos], zero&&i==0); //不管什么情况都要计算后边贡献x的次数
//当当前位置等于x,要计算当前位置贡献x的次数
if(i == x)
{
if(limit && i==data[pos]) //limit的情况下不可能有前导零
ret += num(data, pos-1) + 1;
else if(!(zero && i==0)) //当有前导零并且当前位置也是0,就不加pow(10, pos);
ret += pow(10, pos);
}
}
return dp[pos][limit][zero] = ret;
}
ll solve(ll a, int x)
{
vector<int> data(0);
while (a)
{
data.push_back(a%10);
a/=10;
}
int len = data.size();
vector<vector<vector<ll>>> dp(len, vector<vector<ll>>(2, vector<ll>(2, -1)));
return dfs(dp, data, len-1, x, true, true);
}
int main()
{
ll L, R;
cin >> L >> R;
if(L > R) swap(L,R);
for(int i = 0; i < 10; ++i)
{
cout << solve(R, i) - solve(L-1, i) << (i==9?"":" ");
}
return 0;
}
P2602 [ZJOI2010] 数字计数:数位DP的更多相关文章
- Luogu P2602 [ZJOI2010]数字计数 数位DP
很久以前就...但是一直咕咕咕 思路:数位$DP$ 提交:1次 题解:见代码 #include<cstdio> #include<iostream> #include<c ...
- 洛谷P2602 [ZJOI2010]数字计数(数位dp)
数字计数 题目传送门 解题思路 用\(dp[i][j][k]\)来表示长度为\(i\)且以\(j\)为开头的数里\(k\)出现的次数. 则转移方程式为:\(dp[i][j][k] += \sum_{t ...
- UVA.1640.The Counting Problem / BZOJ.1833.[ZJOI2010]数字计数(数位DP)
题目链接 \(Description\) 求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示). \(Solution\) 对每位分别DP.注意考虑前导0: 在最后统 ...
- [ZJOI2010]数字计数 数位DP
最近在写DP,今天把最近写的都放上来好了,,, 题意:给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 首先询问的是一个区间,显然是要分别求出1 ~ r ,1 ...
- [luogu2602 ZJOI2010] 数字计数 (数位dp)
传送门 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output ...
- 数位dp详解&&LG P2602 [ZJOI2010]数字计数
数位dp,适用于解决一类求x~y之间有多少个符合要求的数或者其他. 例题 题目描述 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除 ...
- 洛谷P2602 [ZJOI2010]数字计数 题解 数位DP
题目链接:https://www.luogu.com.cn/problem/P2602 题目大意: 计算区间 \([L,R]\) 范围内 \(0 \sim 9\) 各出现了多少次? 解题思路: 使用 ...
- 【题解】P2602 数字计数 - 数位dp
P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数 \(a\) 和 \(b\) ,求在 \([a,b]\) 中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中 ...
- P2602 [ZJOI2010]数字计数&P1239 计数器&P4999 烦人的数学作业
P2602 [ZJOI2010]数字计数 题解 DFS 恶心的数位DP 对于这道题,我们可以一个数字一个数字的求 也就是分别统计区间 [ L , R ] 内部数字 i 出现的次数 (0<=i&l ...
- P2602 [ZJOI2010]数字计数(递推)
P2602 [ZJOI2010]数字计数 思路: 首先考虑含有前导0的情况,可以发现在相同的\(i\)位数中,每个数的出现次数都是相等的.所以我们可以设\(f(i)\)为\(i\)位数每个数的出现次数 ...
随机推荐
- jackson、objectMapper 、JsonAlias、JsonProperty、json。序列化和反序列化研究。
总结: @JsonAlias:序列化出来是一定是真名,反序列化时可以传真名(驼峰)Json也可以传别名(下划线)Json @JsonProperty:序列化出来一定是别名,反序列化时也只能传别名Jso ...
- Excel如何核对同一行的两列数据是否一致
方法一 Ctrl+G 快捷键Ctrl+G,点击[定位条件],选择"行内容差异单元格",点击[确定]. 方法二 条件格式 逆向思维,先利用条件格式查找出相同的数据,筛选剔除相同的数据 ...
- NC26212 小石的签到题
题目链接 题目 题目描述 小石和小阳玩游戏,一共有 \(n\) 个数,分别为 \(1 \sim n\) .两人轮流取数,小石先手.对于每轮取数,都必须选择剩下数中的任意一个数 \(x\) ,同时还要取 ...
- GaussDB(for MySQL) Serverless全面商用:无感弹性,极致性价比
本文分享自华为云社区<GaussDB(for MySQL) Serverless全面商用:无感弹性,极致性价比>,作者: GaussDB 数据库. 技术背景 对于现代企业级IT系统,数据库 ...
- java 注解结合 spring aop 实现日志traceId唯一标识
MDC 的必要性 日志框架 日志框架成熟的也比较多: slf4j log4j logback log4j2 我们没有必要重复造轮子,一般是建议和 slf4j 进行整合,便于后期替换为其他框架. 日志的 ...
- Vuex和普通全局对象
Vuex中的核心方法 Vuex是一个专为Vue.js应用程序开发的状态管理模式,其采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化.每一个Vuex应用的核心就是 ...
- Object.definePropety
defineProperty Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象,也就是说,该方法允许精确地添加或修改对象的属 ...
- ELK Stack 分布式日志系统 大纲
1. Elastic Stack 官网: https://www.elastic.co/cn/what-is/elk-stack 2. 硬件配置 2.1 推算依据 ES JVM heap 最大可以设置 ...
- Qt5.15.0 升级至 Qt5.15.9 遇到的一些错误
按照之前我写的文章教程,可以很简单的编译出静态库(仅供学习交流) 编译 windows 上的 qt 静态库 编译出静态库后,替换旧版本的库,见我另一篇文章教程 VS2019 配置 QT 库 之所以没有 ...
- WriteFile 奇怪的现象
项目中有个需求是要对文本内容检索并重写,我们使用的是 WriteFile 覆盖旧的文本内容 最小示例: #include <Windows.h> #include <iostream ...