数位dp练习

ops/2024/10/19 7:28:30/

[SCOI2009] windy 数

题目背景

windy 定义了一种 windy 数。

题目描述

不含前导零且相邻两个数字之差至少为 2 2 2 的正整数被称为 windy 数。windy 想知道,在 a a a b b b 之间,包括 a a a b b b ,总共有多少个 windy 数?

输入格式

输入只有一行两个整数,分别表示 a a a b b b

输出格式

输出一行一个整数表示答案。

样例 #1

样例输入 #1

1 10

样例输出 #1

9

样例 #2

样例输入 #2

25 50

样例输出 #2

20

提示

数据规模与约定

对于全部的测试点,保证 1 ≤ a ≤ b ≤ 2 × 1 0 9 1 \leq a \leq b \leq 2 \times 10^9 1ab2×109

我们要学会画这个图
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;const int N = 12;int f[N][10];
int a[N];// 前置处理
void init() {for (int i = 0; i < 10; i++) f[1][i] = 1;for (int i = 2; i < 12; i++) {for (int j = 0; j < 10; j++) {for (int k = 0; k < 10; k++) {if (abs(j - k) >= 2) f[i][j] += f[i - 1][k];   // 只有符合的才会加上来}}}//cout << "输出f" << endl;}int dp(int x) {if (!x) return 0;int cnt = 0;while (x){a[++cnt] = x % 10, x /= 10;}int res = 0, last = -2;for (int i = cnt; i > 0; i--) {  // 从高位进行处理int now = a[i];for (int j = (i == cnt); j < now; j++) // 最高位要从1开始{if (abs(j - last) >= 2) res += f[i][j];}if (abs(now - last) < 2) break; // 如果不满足定义,就break,就没有分支了last = now;if (i == 1) res++;}// 如果答案有前导零for (int i = 1; i < cnt; i++) {for (int j = 1; j <= 9; j++) {res += f[i][j];}}return res;
}int main() {init();int l, r;cin >> l >> r;cout << dp(r) - dp(l - 1);return 0;
}

[ZJOI2010] 数字计数

题目描述

给定两个正整数 a a a b b b,求在 [ a , b ] [a,b] [a,b] 中的所有整数中,每个数码(digit)各出现了多少次。

输入格式

仅包含一行两个整数 a , b a,b a,b,含义如上所述。

输出格式

包含一行十个整数,分别表示 0 ∼ 9 0\sim 9 09 [ a , b ] [a,b] [a,b] 中出现了多少次。

样例 #1

样例输入 #1

1 99

样例输出 #1

9 20 20 20 20 20 20 20 20 20

提示

数据规模与约定
  • 对于 30 % 30\% 30% 的数据,保证 a ≤ b ≤ 1 0 6 a\le b\le10^6 ab106
  • 对于 100 % 100\% 100% 的数据,保证 1 ≤ a ≤ b ≤ 1 0 12 1\le a\le b\le 10^{12} 1ab1012
#include <bits/stdc++.h>
using namespace std;
const int N = 15;
typedef long long ll;
ll l, r, dp[N], mi[N];
ll ans1[N], ans2[N];
int a[N];void solve(ll n, ll *ans) {ll tmp = n;int len = 0;while (n) a[++len] = n % 10, n /= 10;for (int i = len; i >= 1; --i) {for (int j = 0; j < 10; j++) ans[j] += dp[i - 1] * a[i];for (int j = 0; j < a[i]; j++) ans[j] += mi[i - 1];tmp -= mi[i - 1] * a[i], ans[a[i]] += tmp + 1;ans[0] -= mi[i - 1];}
}int main() {scanf("%lld%lld", &l, &r);mi[0] = 1ll;for (int i = 1; i <= 13; ++i) {dp[i] = dp[i - 1] * 10 + mi[i - 1];mi[i] = 10ll * mi[i - 1];}solve(r, ans1), solve(l - 1, ans2);for (int i = 0; i < 10; ++i) printf("%lld ", ans1[i] - ans2[i]);return 0;
}

度的数量

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/ops/25310.html

相关文章

linux驱动-CCF-1 provider 注册时钟

CCF: common clock frameword provider 注册时钟分析 1. 待注册 时钟数据 #define _REGISTER(f, s, ...) { .clk_register (bcm2835_clk_register)f, \.supported s, \.data __VA_ARGS__ } #define REGISTER_CLK(s, ...) _REGISTER(&bcm2835_register_clock, \s, …

Redis(七) zset有序集合类型

文章目录 前言命令ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZPOPMAXZPOPMIN两个阻塞版本的POP命令BZPOPMAX BZPOPMINZRANKZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBY集合间操作ZINTERSTOREZUNIONSTORE 命令小结 内部编码使用场景 前言 对于有序集合这个名…

Big Data 平障录

Hive Hive 生成带压缩的格式&#xff0c;需要如此设置 SET parquet.compressionSNAPPY;yarn.scheduler.fair.assignmultiple 相关jira&#xff1a;https://issues.apache.org/jira/browse/YARN-5035 yarn.scheduler.fair.assignmultiple是YARN Fair Scheduler的一个配置参数…

vue 配合 video.js 实现视频播放

1. 导入 video.js 包 npm install video.js -S npm install videojs-flash -S 2. 代码实现 <template><div><videoid"my-video"class"video-js"controlspreload"auto"width"640"height"264":poster&quo…

Linux基础——Linux开发工具(上)vim

前言&#xff1a;在了解完Linux基本指令和Linux权限后&#xff0c;我们有了足够了能力来学习后面的内容&#xff0c;但是在真正进入Linux之前&#xff0c;我们还得要学会使用Linux中的几个开发工具。而我们主要介绍的是以下几个&#xff1a; yum, vim, gcc / g, gdb, make / ma…

大型语言模型LLM的数据管理与应用

大型语言模型&#xff08;LLM&#xff09;风靡全球&#xff0c;尤其是 OpenAI 的最新发展。LLMs 的魅力来自于其理解、解释和生成人类语言的能力&#xff0c;而这曾被认为是人类的专属领域。像 CoPilot 这样的工具正在迅速融入开发人员的日常生活&#xff0c;而以 ChatGPT 为动…

stm32单片机开发一、中断之外部中断实验

stm32单片机的外部中断和定时器中断、ADC中断等都由stm32的内核中的NVIC模块控制&#xff0c;stm32的中断有很多中&#xff0c;比如供电不足中断&#xff0c;当供电不足时&#xff0c;会产生的一种中断&#xff0c;这么多中断如果都接在CPU上&#xff0c;或者说CPU去处理&#…

Ieetcode——21.合并两个有序链表

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 合并两个有序链表我们的思路是创建一个新链表&#xff0c;然后遍历已知的两个有序链表&#xff0c;并比较其节点的val值&#xff0c;将小的尾插到新链表中&#xff0c;然后继续遍历&#xff0c;直到将该两个链表…