最新要闻
- 河南省财政下达资金175.64亿元支持城乡义务教育均衡发展
- 菲律宾环保人士:反对日本强推核污染水排海 不能让海洋成为垃圾场
- 莲花幕(关于莲花幕简述)
- 新华财经|报告认为2023年RCEP成员国间海运贸易形势将好于全球
- 萍乡市新联会网络人士分会(关于萍乡市新联会网络人士分会简述)
- 苹果退款电话是多少 苹果退款电话
- 惠州家华物业100%股权将拍卖,起拍价10万元
- 苹果手机助手怎么唤醒(苹果手机助手)
- 登康口腔最新公告:半年报净利润6596.91万元 同比增长13.48%
- 《西瓜对对碰》100元提现真实性介绍
- 签订三方合同后可以辞职吗
- 长安Lumin糯玉米香沁款:市场竞争力进一步提升
- 小米平板6首次降价:仅1799元起!
- 表现堪比内屏!OPPO Find N3 Flip外屏功能惊艳
- 女子开保时捷连撞四五辆路边违停车辆:需负主要责任
- 滴滴向小鹏汽车出售智能电动汽车相关资产和研发能力:后者将打造全新品牌A级智能电动汽车
手机
东北三宝是指哪三宝(东北三宝是指哪三宝?)
年轻人倡导“数字解毒” 美国功能机、翻盖机又火了
- 东北三宝是指哪三宝(东北三宝是指哪三宝?)
- 年轻人倡导“数字解毒” 美国功能机、翻盖机又火了
- 求生之路2手枪P226数据一览(求生之路2手感好的枪mod)
- 发达国家的GDP在全球的排名情况
- 恩捷股份:8月24日进行路演,交银施罗德基金、泉果基金等多家机构参与
- 幸福迎泽丨护苗成长,乐在文庙
家电
数位dp部分题解
前言
最近学了一种新的数位dp的状态表示,打算应用到以前做过的数位dp的题目。如果我们对数$N$进行数位dp,以前的状态定义$f(i,j)$表示所有数位大小为$i$且最高位是数字$j$的数的个数,如果还有其他约束条件那么再补充相应的状态即可。而新的状态定义则是$f(i,1)$和$f(i,0)$,其中$f(i,1)$表示所有数位大小为$i$且值不超过$N \bmod 10^i$的数的数量,相应的$f(i,0)$表示所有数位大小为$i$且值超过$N \bmod 10^i$的数的数量。其中$N \bmod 10^i$表示$N$在十进制下的最低有效$i$位数字构成的值,例如$123456789$的最低有效$6$位数字构成的值就是$456789$。
下面通过几道题目来运用这种新的做法。
数字游戏
科协里最近很流行数字游戏。
(资料图片仅供参考)
某人命名了一种不降数,这种数字必须满足从左到右各位数字呈非下降关系,如 $123$,$446$。
现在大家决定玩一个游戏,指定一个整数闭区间 $[a,b]$,问这个区间内有多少个不降数。
输入格式
输入包含多组测试数据。
每组数据占一行,包含两个整数 $a$ 和 $b$。
输出格式
每行给出一组测试数据的答案,即 $[a,b]$ 之间有多少不降数。
数据范围
$1 \le a \le b \le 2^{31}-1$
输入样例:
1 91 19
输出样例:
918
解题思路
定义状态$f(i,j,k)$满足以下条件的整数$n$的数量:
- $n$的数位大小为$i$,$0 \leq n < 10^i$。
- 若$n \leq N \bmod 10^i$,则$j=1$;否则$j=0$。
- $n$的最高位是数字$k$。
- $n$从左到右各位数字呈非递降。
对于确定的状态$f(i,j,k)$,我们可以枚举数位是$i+1$的数的最高位是哪个数字(记作$u$)来转移到数位大小是$i+1$的状态,状态转移方程就是$$f(i,j,k) \longrightarrow f(i+1,\ u < p_i \ \operatorname{or} \ u = p_i \ \operatorname{and} \ j, \ u) \quad (u \leq k)$$
其中$p_i$表示的是$N$在十进制下从低位(第$0$位)开始的第$i$位上的数字。然后再考虑一下是否需要处理前导$0$的情况,可以发现包含前导$0$并不会影响答案,因为包含前导$0$的数仍然满足从左到右各位数字呈非下降关系。因此最终答案就是$\sum\limits_{i=0}^{9}{f(sz,1,i)}$,其中$sz$是$N$在十进制下的数位个数。
AC代码如下,时间复杂度为$O(10^2 \cdot \log{N})$:
1 #include2 using namespace std; 3 4 const int N = 12; 5 6 int f[N][2][10]; 7 int p[N], sz; 8 9 int get(int x) {10 if (!x) return 1;11 sz = 0;12 while (x) {13 p[sz++] = x % 10;14 x /= 10;15 }16 memset(f, 0, sizeof(f));17 for (int i = 0; i <= 9; i++) {18 f[1][i <= p[0]][i]++;19 }20 for (int i = 1; i < sz; i++) {21 for (int j = 0; j <= 1; j++) {22 for (int k = 0; k <= 9; k++) {23 for (int u = 0; u <= k; u++) {24 f[i + 1][u < p[i] || u == p[i] && j][u] += f[i][j][k];25 }26 }27 }28 }29 int ret = 0;30 for (int i = 0; i <= 9; i++) {31 ret += f[sz][1][i];32 }33 return ret;34 }35 36 int main() {37 int a, b;38 while (~scanf("%d %d", &a, &b)) {39 printf("%d\n", get(b) - get(a - 1));40 }41 42 return 0;43 }
Windy数
Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 $2$ 的正整数被称为 Windy 数。
Windy 想知道,在 $A$ 和 $B$ 之间,包括 $A$ 和 $B$,总共有多少个 Windy 数?
输入格式
共一行,包含两个整数 $A$ 和 $B$。
输出格式
输出一个整数,表示答案。
数据范围
$1 \le A \le B \le 2 \times 10^9$
输入样例1:
1 10
输出样例1:
9
输入样例2:
25 50
输出样例2:
20
解题思路
定义状态$f(i,j,k)$满足以下条件的整数$n$的数量:
- $n$的数位大小为$i$,$0 \leq n < 10^i$。
- 若$n \leq N \bmod 10^i$,则$j=1$;否则$j=0$。
- $n$的最高位是数字$k$。
- $n$的所有相邻数位上的数相差至少为$2$。
状态转移方程为$$f(i,j,k) \longrightarrow f(i+1,\ u < p_i \ \operatorname{or} \ u = p_i \ \operatorname{and} \ j, \ u) \quad (|u - k| \geq 2)$$
这里就需要处理前导$0$的情况,这是因为前导$0$可能会使得数不满足相邻两个数字之差至少为$2$这个条件,比如$15$是满足条件的,而$015$就不满足条件了。为了避免前导$0$的情况,这时我们只需分别考虑$1 \sim sz$每一个数位大小,统计最高位的数字不是$0$的情况即可,有$\sum\limits_{i=1}^{sz}{\sum\limits_{j=1}^{9}{f(i,1,j)}}$。除此之外,当数位大小不足$sz$,即$i < sz$时,我们默认往高位补$0$(并非添加前导$0$),这时不管最低$i$位怎么填数字,整个数都不会超过$N$,因此还需要加上$\sum\limits_{i=1}^{sz-1}{\sum\limits_{j=1}^{9}{f(i,0,j)}}$。因此最终答案就是$$\sum\limits_{i=1}^{sz}{\sum\limits_{j=1}^{9}{f(i,1,j)}} + \sum\limits_{i=1}^{sz-1}{\sum\limits_{j=1}^{9}{f(i,0,j)}}$$
AC代码如下,时间复杂度为$O(10^2 \cdot \log{N})$:
1 #include2 using namespace std; 3 4 const int N = 15; 5 6 int f[N][2][10]; 7 int p[N], sz; 8 9 int get(int x) {10 if (!x) return 0;11 sz = 0;12 while (x) {13 p[sz++] = x % 10;14 x /= 10;15 }16 memset(f, 0, sizeof(f));17 for (int i = 0; i <= 9; i++) {18 f[1][i <= p[0]][i]++;19 }20 for (int i = 1; i < sz; i++) {21 for (int j = 0; j <= 1; j++) {22 for (int k = 0; k <= 9; k++) {23 for (int u = 0; u <= 9; u++) {24 if (abs(k - u) >= 2) f[i + 1][u < p[i] || u == p[i] && j][u] += f[i][j][k];25 }26 }27 }28 }29 int ret = 0;30 for (int i = 1; i <= sz; i++) {31 for (int j = 1; j <= 9; j++) {32 ret += f[i][1][j];33 if (i < sz) ret += f[i][0][j];34 }35 }36 return ret;37 }38 39 int main() {40 int a, b;41 scanf("%d %d", &a, &b);42 printf("%d", get(b) - get(a - 1));43 44 return 0;45 }
数字游戏 II
由于科协里最近真的很流行数字游戏。
某人又命名了一种取模数,这种数字必须满足各位数字之和 $mod\ N$ 为 $0$。
现在大家又要玩游戏了,指定一个整数闭区间 $[a.b]$,问这个区间内有多少个取模数。
输入格式
输入包含多组测试数据,每组数据占一行。
每组数据包含三个整数 $a,b,N$。
输出格式
对于每个测试数据输出一行结果,表示区间内各位数字和 $mod\ N$ 为 $0$ 的数的个数。
数据范围
$1 \le a,b \le 2^{31}-1$,$1 \le N < 100$
输入样例:
1 19 9
输出样例:
2
解题思路
定义状态$f(i,j,k)$满足以下条件的整数$n$的数量:
- $n$的数位大小为$i$,$0 \leq n < 10^i$。
- 若$n \leq N \bmod 10^i$,则$j=1$;否则$j=0$。
- $n$的各位数字之和模$m$为$k$。
状态转移方程为$$f(i,j,k) \longrightarrow f\left(i+1,\ u < p_i \ \operatorname{or} \ u = p_i \ \operatorname{and} \ j, \ (u+k) \bmod m\right)$$
可以发现不需要处理前导$0$的情况,因为对$0$求和后并不会影响模$m$的结果。因此最终答案就是$f(sz, 1, 0)$。
AC代码如下,时间复杂度为$O(10 \cdot m \cdot \log{N})$:
1 #include2 using namespace std; 3 4 const int N = 15, M = 110; 5 6 int a, b, m; 7 int f[N][2][M]; 8 int p[N], sz; 9 10 int get(int x) {11 if (!x) return 1;12 sz = 0;13 while (x) {14 p[sz++] = x % 10;15 x /= 10;16 }17 memset(f, 0, sizeof(f));18 for (int i = 0; i <= 9; i++) {19 f[1][i <= p[0]][i % m]++;20 }21 for (int i = 1; i < sz; i++) {22 for (int j = 0; j <= 1; j++) {23 for (int k = 0; k < m; k++) {24 for (int u = 0; u <= 9; u++) {25 f[i + 1][u < p[i] || u == p[i] && j][(u + k) % m] += f[i][j][k];26 }27 }28 }29 }30 return f[sz][1][0];31 }32 33 int main() {34 while (~scanf("%d %d %d", &a, &b, &m)) {35 printf("%d\n", get(b) - get(a - 1));36 }37 38 return 0;39 }
不要62
杭州人称那些傻乎乎粘嗒嗒的人为 $62$(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有 $4$ 或 $62$ 的号码。例如:$62315,73418,88914$ 都属于不吉利号码。但是,$61152$ 虽然含有 $6$ 和 $2$,但不是 连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照号区间 $[n,m]$,推断出交管局今后又要实际上给多少辆新的士车上牌照了。
输入格式
输入包含多组测试数据,每组数据占一行。
每组数据包含一个整数对 $n$ 和 $m$。
当输入一行为“0 0”时,表示输入结束。
输出格式
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。
数据范围
$1 \le n \le m \le 10^9$
输入样例:
1 1000 0
输出样例:
80
解题思路
定义状态$f(i,j,k)$满足以下条件的整数$n$的数量:
- $n$的数位大小为$i$,$0 \leq n < 10^i$。
- 若$n \leq N \bmod 10^i$,则$j=1$;否则$j=0$。
- $n$的最高位是数字$k$。
- $n$中不含有数字$4$以及相邻的$62$。
状态转移方程为$$f(i,j,k) \longrightarrow f(i+1,\ u < p_i \ \operatorname{or} \ u = p_i \ \operatorname{and} \ j, \ u) \quad (u \ne 4 \ \operatorname{and} \ \neg (u=6 \ \operatorname{and} \ k=2 ))$$
可以发现不需要处理前导$0$的情况,因此最终答案就是$\sum\limits_{i=0}^{9}{f(sz,1,i)}$。
AC代码如下,时间复杂度为$O(10^2 \cdot \log{N})$:
1 #include2 using namespace std; 3 4 const int N = 15; 5 6 int f[N][2][N]; 7 int p[N], sz; 8 9 int get(int x) {10 if (!x) return 1;11 sz = 0;12 while (x) {13 p[sz++] = x % 10;14 x /= 10;15 }16 memset(f, 0, sizeof(f));17 for (int i = 0; i <= 9; i++) {18 if (i != 4) f[1][i <= p[0]][i]++;19 }20 for (int i = 1; i < sz; i++) {21 for (int j = 0; j <= 1; j++) {22 for (int k = 0; k <= 9; k++) {23 for (int u = 0; u <= 9; u++) {24 if (u == 6 && k == 2 || u == 4) continue;25 f[i + 1][u < p[i] || u == p[i] && j][u] += f[i][j][k];26 }27 }28 }29 }30 int ret = 0;31 for (int i = 0; i <= 9; i++) {32 ret += f[sz][1][i];33 }34 return ret;35 }36 37 int main() {38 int a, b;39 while (scanf("%d %d", &a, &b), a) {40 printf("%d\n", get(b) - get(a - 1));41 }42 43 return 0;44 }
参考资料
F - Nim Editorial:https://atcoder.jp/contests/abc317/editorial/7047
关键词:
数位dp部分题解
QT Creator 远程调试 QT 程序
乌尔善透露《封神第二部》计划明年暑期档上映,故事会有悬念
我为群众办实事 上门服务暖人心
产业服务联盟专家委员会正式成立
余承东:将在成都车展公布大惊喜
钢木家具餐桌图片(钢木家具)
解危济困办实事 贺兰县守护群众“安居梦”
宁波市解放南路小学(关于宁波市解放南路小学简述)
河南省财政下达资金175.64亿元支持城乡义务教育均衡发展
菲律宾环保人士:反对日本强推核污染水排海 不能让海洋成为垃圾场
理想汽车“双能战略”推进,纯电MPV理想MEGA将于12月发布
梅西为迈阿密国际出战714分钟11球3助,每51分钟参与1球
192168001 登陆入口 192 168 0 0
甘肃兰州:多措并举战旱情,全力以赴保生产
Ch美瓷强制
东北三宝是指哪三宝(东北三宝是指哪三宝?)
萧山市民中心社保咨询电话 萧山市民中心
莲花山跨江公路通道(关于莲花山跨江公路通道简述)
莲花幕(关于莲花幕简述)
情人节送什么礼物给男生比较好 情人节送男生什么礼物好
夏天旅游好去处国内 夏天旅游好去处
房子多少钱一个平方怎么算 一个平方怎么算
随手记理财怎么样 随手记理财可靠吗
【新时代 新征程 新伟业】延安:主打“红色+”业态 旅游市场“热”力十足
虚拟电厂帮电网“减负”
营里村(关于营里村简述)
新华财经|报告认为2023年RCEP成员国间海运贸易形势将好于全球
中国国际机场空间分布特征(附名单)
年轻人倡导“数字解毒” 美国功能机、翻盖机又火了
天生我材不自弃
核技术专家谈日本核污染水排海:淋雨后洗头可洗掉沾染的放射性元素
孙梦成(关于孙梦成简述)
萍乡市新联会网络人士分会(关于萍乡市新联会网络人士分会简述)
苹果退款电话是多少 苹果退款电话
深交所:将融资保证金比例从100%降低至80% 促进两融业务功能有效发挥
word表格最后一页空白页删不掉(最后一页空白页删不掉)
求生之路2手枪P226数据一览(求生之路2手感好的枪mod)
一字之师的典故是谁 一字之师的典故是谁提出的
女子长期侧躺玩手机致右眼短暂失明:双眼眼底产生豹纹状病变
汽车知识解答速腾怎么激活锁车声音?
创造历史!陈清晨/贾一凡第4次夺得世锦赛女双冠军
王艺迪状态堪忧,热身赛接连失利,国乒亚运会单打名额再现争议!
水质专员康静伟和王嘉希:只为这一泓清水永续北上
惠州家华物业100%股权将拍卖,起拍价10万元
市场监管总局:加大水产品食品安全监管及食盐价格监管力度
苹果手机助手怎么唤醒(苹果手机助手)
市场监管总局加大水产品食品安全监管及食盐价格监管力度
中国将上万条鱼养在三峡中,如今怎么样了?现实让人不得不服
奇瑞v5报价
Rookie:我看着很虚?说什么都行别说我虚
发达国家的GDP在全球的排名情况
数额巨大!中原地产回应被拖欠佣金:不具提前垫付能力
杭州全力打造首届碳中和亚运会
第十四届中国-东北亚博览会项目投资规模创新高
【石榴花开 籽籽同心】传承历史文脉 讲好文物展品里的民族团结故事
登康口腔最新公告:半年报净利润6596.91万元 同比增长13.48%
恩捷股份:8月24日进行路演,交银施罗德基金、泉果基金等多家机构参与
黄土高原林草植被覆盖度达59%以上 蓄水保土能力显著增强
减半征收证券交易印花税,使减税让利政策惠及广大中小投资者
新闻调查丨从勤俭节约到循环经济 看治理塑料污染的“绿色逆袭”
2019凌派180Turbo手动舒适型怎么样及2019款凌派内饰颜色有几种
申花抽油烟机怎样清洗(申花抽油烟机)
怎么添加打印机win10 win10怎样添加打印机
4寸蛋糕一般几个人吃 4寸蛋糕够几个人吃
9省区18支农民篮球队现身宁夏固原 角逐全国“村BA”总决赛“入场券”
菁华浮梦(关于菁华浮梦简述)
《西瓜对对碰》100元提现真实性介绍
幸福迎泽丨护苗成长,乐在文庙
论文期刊封底是什么 封底是什么
序幕和帷幕的区别? 序幕和帷幕的区别
签订三方合同后可以辞职吗
强大鲲鹏动力!捷途旅行者亮相成都车展,低至14.09万起预售!
科隆展最佳Xbox和PS游戏:《真人快打1》|《铁拳8》
寿命最长的动物,从明朝活到了现在,如今已经512岁了
云铝股份:下半年水电发电形势较好
MG品牌全明星阵容闪耀成都车展 开启百年庆典
269个,107.5845MW!呼伦贝尔市分散式风电、分布式光伏发电项目清单公布!
超燃!长沙望城男子篮球百村争霸赛巅峰对决,冠军出炉
扬帆行动 “县”在出发 建行扬州分行奋进裕农富农路
羊脂玉是什么玉
28.28万元起,起亚高能纯电轿跑EV6正式上市
宁化县泉上中心学校(关于宁化县泉上中心学校简述)
金字塔结构图 金字塔结构
莲宝叶则·石头山景区(关于莲宝叶则·石头山景区简述)
国联证券-中微公司-688012-业务维持快速增长,新品研发符合预期-230827
台风“苏拉”将给福建带来严重风雨影响
因天气原因,这项活动取消
长安Lumin糯玉米香沁款:市场竞争力进一步提升
Win11更新引发部分主板蓝屏 两种临时解决办法来了
财政部、税务总局:减半征收证券交易印花税
各地将灾后重建与新一轮洪涝风险应对工作相结合 最大限度确保群众生命财产安全
“凡尘”组合创造历史 夺得羽毛球世锦赛女双第四冠
普路通(002769.SZ):2023年半年度计提资产减值准备2058.40万元
韩议员:“反对日本犯罪行为!将要求赔偿”
小米平板6首次降价:仅1799元起!
表现堪比内屏!OPPO Find N3 Flip外屏功能惊艳
女子开保时捷连撞四五辆路边违停车辆:需负主要责任
滴滴向小鹏汽车出售智能电动汽车相关资产和研发能力:后者将打造全新品牌A级智能电动汽车
589元起 华为昆仑玻璃更换服务上新:nova系列首次加入