数位DP模型

news/2024/5/18 1:55:42/文章来源:https://blog.csdn.net/qq947467490/article/details/137405798

目录

  • 度的数量
    • 思路
    • 代码实现
      • 暴力解法
      • 数位DP
  • 数字游戏
    • 代码实现
  • Windy数
    • 代码实现
  • 数字游戏 II
    • 代码实现
  • 不要62
    • 代码实现
  • 恨7不成妻
    • 代码实现


度的数量

题目描述:

求给定区间 [ X , Y ] [X,Y] [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K K K 个互不相等的 B B B 的整数次幂之和。

例如,设 X = 15 , Y = 20 , K = 2 , B = 2 X=15, Y=20, K=2, B=2 X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意:

17 = 2 4 + 2 0 17 = 2^4 + 2^0 17=24+20

18 = 2 4 + 2 1 18 = 2^4 + 2^1 18=24+21

20 = 2 4 + 2 2 20 = 2^4 + 2^2 20=24+22

输入格式:

第一行包含两个整数 X X X Y Y Y,接下来两行包含整数 K K K B B B

输出格式:

只包含一个整数,表示满足条件的数的个数。

数据范围:

1 ≤ X ≤ Y ≤ 2 31 − 1 , 1 ≤ K ≤ 20 , 2 ≤ B ≤ 10 1 ≤ X ≤ Y ≤ 2^{31} − 1, 1 ≤ K ≤ 20, 2 ≤ B ≤ 10 1XY2311,1K20,2B10

输入样例:

15 20
2
2

输出样例:

3

思路

利用前缀和的思想求解对应区间符合形式的数的个数。

[ l , r ] ⇔ [ 0 , r ] − [ 0 , l − 1 ] [l, r] ⇔ [0, r] - [0, l - 1] [l,r][0,r][0,l1]

要使这个数恰好等于 K K K 个互不相等的 B B B 的整数次幂之和,即化为 B B B 进制之后,存在 K K K 1 1 1,除 1 1 1 0 0 0 之外的数均不可出现。

例如: B = 3 B=3 B=3 K = 2 K=2 K=2,一个符合的数是 12 12 12,把 12 12 12 化为三进制 110 ,其中有 2 2 2 1 1 1,其余都是 0 0 0


代码实现

暴力解法

import sys
input = sys.stdin.readlinex, y = map(int, input().strip().split())
k, b = int(input().strip()), int(input().strip())def dfs(cnt, idx, total, up):if total > up:return 0if cnt == k:return 1if pow(b, idx) > up:return 0return dfs(cnt, idx + 1, total, up) + dfs(cnt + 1, idx + 1, total + pow(b, idx), up)print(dfs(0, 0, 0, y) - dfs(0, 0, 0, x - 1))

数位DP

import sys
from functools import cache
sys.setrecursionlimit(1000000)
input = sys.stdin.readlinex, y = map(int, input().strip().split())
k, b = int(input().strip()), int(input().strip())def int_to_base_b(n):if n == 0:return "0"res = ""while n:res = str(n % b) + resn //= breturn res@cache
def dfs(idx, cnt, is_limit, is_num, s):if len(s) == idx:return int(cnt == k and is_num)if cnt > k:return 0res = 0if not is_num:res = dfs(idx + 1, cnt, False, False, s)up = min(1, int(s[idx])) if is_limit else 1for d in range(1 - int(is_num), up + 1):res += dfs(idx + 1, cnt + d, is_limit and d == int(s[idx]), True, s)return resprint(dfs(0, 0, True, False, int_to_base_b(y)) - dfs(0, 0, True, False, int_to_base_b(x - 1)))

数字游戏

题目描述:

科协里最近很流行数字游戏。

某人命名了一种不降数,这种数字必须满足从左到右各位数字呈非下降关系,如 123 123 123 446 446 446

现在大家决定玩一个游戏,指定一个整数闭区间 [a,b],问这个区间内有多少个不降数。

输入格式:

输入包含多组测试数据。

每组数据占一行,包含两个整数 a a a b b b

输出格式:

每行给出一组测试数据的答案,即 [ a , b ] [a,b] [a,b] 之间有多少不降数。

数据范围:

1 ≤ a ≤ b ≤ 2 3 1 − 1 1 ≤ a ≤ b ≤ 2^31−1 1ab2311

输入样例:

1 9
1 19

输出样例:

9
18

代码实现

import sys
from functools import lru_cache
sys.setrecursionlimit(1000000)
input = sys.stdin.readline@lru_cache(maxsize=None, typed=False)
def dfs(idx, front, is_limit, is_num, s):if idx == len(s):return int(is_num)res = 0if not is_num:res = dfs(idx + 1, 0, False, False, s)up = int(s[idx]) if is_limit else 9for d in range(max(1 - int(is_num), front), up + 1):res += dfs(idx + 1, d, is_limit and d == up, True, s)return restry:while True:a, b = map(int, input().strip().split())print(dfs(0, 0, True, False, str(b)) - dfs(0, 0, True, False, str(a - 1)))except ValueError:sys.exit(0)

Windy数

题目描述:

W i n d y Windy Windy 定义了一种 W i n d y Windy Windy 数:不含前导零且相邻两个数字之差至少为 2 2 2 的正整数被称为 W i n d y Windy Windy 数。

W i n d y Windy Windy 想知道,在 A A A B B B 之间,包括 A A A B B B,总共有多少个 W i n d y Windy Windy 数?

输入格式:

共一行,包含两个整数 A A A B B B

输出格式:

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

数据范围:

1 ≤ A ≤ B ≤ 2 × 1 0 9 1 ≤ A ≤ B ≤ 2×10^9 1AB2×109

输入样例1:

1 10

输出样例1:

9

输入样例2:

25 50

输出样例2:

20

代码实现

import sys
from functools import lru_cache
sys.setrecursionlimit(1000000)
input = sys.stdin.readline@lru_cache(maxsize=None, typed=False)
def dfs(idx, front, is_limit, is_num, s):if idx == len(s):return int(is_num)res = 0if not is_num:res = dfs(idx + 1, front, False, False, s)up = int(s[idx]) if is_limit else 9for d in range(1 - int(is_num), up + 1):if is_num and abs(front - d) < 2:continueres += dfs(idx + 1, d, is_limit and d == up, True, s)return resa, b = map(int, input().strip().split())
print(dfs(0, 0, True, False, str(b)) - dfs(0, 0, True, False, str(a - 1)))

数字游戏 II

题目描述:

由于科协里最近真的很流行数字游戏。

某人又命名了一种取模数,这种数字必须满足各位数字之和 m o d N \mod N modN 0 0 0

现在大家又要玩游戏了,指定一个整数闭区间 [ a , b ] [a,b] [a,b],问这个区间内有多少个取模数。

输入格式:

输入包含多组测试数据,每组数据占一行。

每组数据包含三个整数 a , b , N a, b, N a,b,N

输出格式:

对于每个测试数据输出一行结果,表示区间内各位数字和 m o d N \mod N modN 0 0 0 的数的个数。

数据范围:

1 ≤ a , b ≤ 2 31 − 1 , 1 ≤ N < 100 1 ≤ a, b ≤ 2^{31}−1, 1 ≤ N < 100 1a,b2311,1N<100

输入样例:

1 19 9

输出样例:

2

代码实现

import sys
from functools import lru_cache
sys.setrecursionlimit(1000000)
input = sys.stdin.readlinea, b, N = map(int, input().strip().split())@lru_cache(maxsize=None, typed=False)
def dfs(idx, total, is_limit, is_num, s):if len(s) == idx:return int(is_num and total % N == 0)res = 0if not is_num:res = dfs(idx + 1, total, False, False, s)up = int(s[idx]) if is_limit else 9for d in range(1 - int(is_num), up + 1):res += dfs(idx + 1, (total + d) % N, is_limit and d == up, True, s)return resprint(dfs(0, 0, True, False, str(b)) - dfs(0, 0, True, False, str(a - 1)))

不要62

题目描述:

杭州人称那些傻乎乎粘嗒嗒的人为 62 62 62(音: l a o e r laoer laoer)。

杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。

不吉利的数字为所有含有 4 4 4 62 62 62 的号码。例如: 62315 62315 62315 73418 73418 73418 88914 88914 88914 都属于不吉利号码。但是, 61152 61152 61152 虽然含有 6 6 6 2 2 2,但不是连号,所以不属于不吉利数字之列。

你的任务是,对于每次给出的一个牌照号区间 [ n , m ] [n, m] [n,m],推断出交管局今后又要实际上给多少辆新的士车上牌照了。

输入格式:

输入包含多组测试数据,每组数据占一行。

每组数据包含一个整数对 n n n m m m

当输入一行为 0 0 时,表示输入结束。

输出格式:

对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。

数据范围:

1 ≤ n ≤ m ≤ 1 0 9 1 ≤ n ≤ m ≤ 10^9 1nm109

输入样例:

1 100
0 0

输出样例:

80

代码实现

import sys
from functools import lru_cache
sys.setrecursionlimit(1000000)
input = sys.stdin.readline@lru_cache(maxsize=None, typed=False)
def dfs(idx, front, is_limit, is_num, s):if idx == len(s):return int(is_num)res = 0if not is_num:res = dfs(idx + 1, front, False, False, s)up = int(s[idx]) if is_limit else 9for d in range(1 - int(is_num), up + 1):if is_num and d == 2 and front == 6 or d == 4:continueres += dfs(idx + 1, d, is_limit and d == up, True, s)return reswhile True:n, m = map(int, input().strip().split())if n == m == 0:breakprint(dfs(0, 0, True, False, str(m)) - dfs(0, 0, True, False, str(n - 1)))

恨7不成妻

题目描述:

单身!

依然单身!

吉哥依然单身!

D S DS DS 级码农吉哥依然单身!

所以,他平生最恨情人节,不管是 214 214 214 还是 77 77 77,他都讨厌!

吉哥观察了 214 214 214 77 77 77 这两个数,发现:

2 + 1 + 4 = 7 2 + 1 + 4 = 7 2+1+4=7

7 + 7 = 7 × 2 7 + 7 = 7 \times 2 7+7=7×2

77 = 7 × 11 77 = 7 \times 11 77=7×11

最终,他发现原来这一切归根到底都是因为和 7 7 7 有关!

所以,他现在甚至讨厌一切和 7 7 7$ 有关的数!

什么样的数和 7 7 7 有关呢?

如果一个整数符合下面三个条件之一,那么我们就说这个整数和 7 7 7 有关:

① 整数中某一位是 7 7 7

② 整数的每一位加起来的和是 7 7 7 的整数倍;

③ 这个整数是 7 7 7 的整数倍。

现在问题来了:吉哥想知道在一定区间内和 7 7 7 无关的整数的平方和。

输入格式:

第一行包含整数 T T T,表示共有 T T T 组测试数据。

接下来 T T T 行,每行包含两个整数 L L L R R R

输出格式:

对于每组数据,请计算 [ L , R ] [L, R] [L,R] 中和 7 7 7 无关的数字的平方和,并将结果对 1 0 9 + 7 10^9 + 7 109+7 取模后输出。

数据范围:

1 ≤ T ≤ 50 1 ≤ T ≤ 50 1T50

1 ≤ L ≤ R ≤ 1 0 18 1 ≤ L ≤ R ≤ 10^{18} 1LR1018

输入样例:

3
1 9
10 11
17 17

输出样例:

236
221
0

代码实现

import sys
from functools import lru_cache
sys.setrecursionlimit(1000000)
input = sys.stdin.readline@lru_cache(maxsize=None, typed=False)
def dfs(idx, sum_digit, total, is_limit, is_num, s):if idx == len(s):if not is_num or sum_digit % 7 == 0 or int(total) % 7 == 0:return 0return int(total) ** 2res = 0if not is_num:res = dfs(idx + 1, sum_digit, total, False, False, s)up = int(s[idx]) if is_limit else 9for d in range(1 - int(is_num), up + 1):if d == 7:continueres += dfs(idx + 1, sum_digit + d, total + str(d), is_limit and d == up, True, s)return rest = int(input().strip())
for _ in range(t):a, b = map(int, input().strip().split())print(dfs(0, 0, "", True, False, str(b)) - dfs(0, 0, "", True, False, str(a - 1)))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1045706.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SpringBoot3】Bean管理

1.Bean扫描 1.1传统Spring 标签&#xff1a;<context:component-scan base-package"com. example "/>注解&#xff1a;ComponentScan(basePackages "com.example") 1.2SpringBoot SpringBoot默认扫描启动类所在的包及其子包 2.Bean注册 如果要注…

水牛社:互联网赚钱秘籍,免费项目,你真敢要吗?

免费是最贵的。真正理解并使用这句话的只有少数人&#xff0c;今天在网上分享一下免费项目背后的逻辑&#xff0c;抛开现象&#xff0c; 本质是最重要的。 我从事互联网工作15年。不管是过去还是现在&#xff0c;总有人喜欢问有没有免费项目&#xff1f; 其实我平时懒得回答…

如何使用 ChatGPT

原文&#xff1a;How To Use Chatgpt 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 总体介绍 在人工智能和在线创业不断扩张的世界中&#xff0c;ChatGPT 的出现为寻求利用 AI 推动在线成功的个人和企业开辟了令人兴奋的新途径。本书《如何使用 ChatGPT&#xff1a;…

【Linux】进程初步理解

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 冯诺依曼体系结构1.1 认识冯诺依曼体系结构1.2 存储金字塔 2. 操作系统2.1 概念2.2 结构2.3 操作系统的管理 3. 进程3.1 进程描述3.2 Linux下的PCB 4. task_struct本身内部属性4.1 启动4.2 进程的创建方式4.2.1 父…

3 突破编程_前端_SVG(rect 矩形)

1 rect 元素的基本属性和用法 在SVG中&#xff0c;<rect> 元素用于创建矩形。 <rect> 元素有一些基本的属性&#xff0c;可以用来定义矩形的形状、位置、颜色等。以下是这些属性的详细解释&#xff1a; x 和 y &#xff1a;这两个属性定义矩形左上角的位置。 x …

106. 跑步锻炼(结果填空)

public class Main { public static void main(String[] args) { int startYear 2000; int startMonth 1; int startDay 1; // 周六 int endYear 2020; int endMonth 10; int endDay 1; // 周四 int totalDistance 0; // 计算开始日期到结束日期之间的每一天 …

应急响应-挖矿脚本检测指南威胁情报样本定性文件清除入口修复

一、演示案例-挖矿样本-Win&Linux-危害&定性 危害&#xff1a;CPU拉满&#xff0c;网络阻塞&#xff0c;服务器卡顿等 定性&#xff1a;威胁情报平台上传解析分析&#xff0c;文件配置查看等windows样本 linux样本 二、演示案例-Linux-Web安全漏洞导致挖矿事件 某公司…

一例简单的文件夹病毒的分析

概述 这是一个典型的文件夹病毒&#xff0c;使用xp时代的文件夹图标&#xff0c;通过可移动存储介质传播&#xff0c;会向http://fionades.com/ABIUS/setup.exe下载恶意载荷执行。 其病毒母体只是一个加载器&#xff0c;会在内存是解密加载一个反射型的dll&#xff0c;主要的…

【C++】缺省参数和函数重载

目录 1.缺省参数 1.1缺省参数的定义 1.2 缺省参数的简单应用 1.3 缺省参数分类&#xff1a;全缺省参数和半缺省参数 1.3.1半缺省参数 1.3.2全缺省参数 3.缺省参数注意事项&#xff1a;缺省参数不能在函数声明和定义中同时出现 4.函数重载 4.1 函数重载概念 4.2 函数参数类型…

2024年32款数据分析工具分五大类总览

数据分析工具在现代商业和科学中扮演着不可或缺的角色&#xff0c;为组织和个人提供了深入洞察和明智决策的能力。这些工具不仅能够处理大规模的数据集&#xff0c;还能通过强大的分析和可视化功能揭示隐藏在数据背后的模式和趋势。数据分析工具软件主要可以划分为以下五个类别…

uniapp Android 开发手机模拟器调试接口出现 Failed to connect to localhost/127.0.0.1:9999

{“errMsg”:“request:fail abort statusCode:-1 Failed to connect to localhost/127.0.0.1:9999”} 原因&#xff1a;使用模拟器或者手机调用API接口&#xff0c;首先保证在同一局域网&#xff0c;然后要使用 IPV4 的 IP 地址。 打开 cmd 输入 ipconfig 查看 ip 地址 替换代…

【java】spring打包找不到主类

背景 使用IDEA打包spring 一直报错&#xff0c;&#xff1a;IDEA spring Error: Could not find or load main class 解决 添加maven的打包命令&#xff1a; 添加&#xff0c;打包依赖到 jar包中 package assembly:single

蓝桥杯练习系统(算法训练)ALGO-958 P0704回文数和质数

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 一个数如果从左往右读和从右往左读数字是完全相同的&#xff0c;则称这个数为回文数&#xff0c;比如898,1221,15651都是回文数。编写…

创新指南|贝恩的产品经理RAPID框架:解决问题的分步指南,使决策过程既高效又民主

您是否曾发现自己陷入项目的阵痛之中&#xff0c;决策混乱、角色不明确、团队成员之间的冲突不断升级&#xff1f;作为产品经理&#xff0c;驾驭这艘船穿过如此汹涌的水域可能是令人畏惧的。应对这些挑战的关键在于采用清晰、结构化的决策方法。输入贝恩的 RAPID 框架&#xff…

Linux文件搜索工具(gnome-search-tool)

opensuse下安装: sudo zypper install gnome-search-tool 操作界面:

【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 本文介绍SpringBoot整合Redis并且进行接口的限流&#xff0c;文章主要介绍的是一种思想&#xff0c;具体代码还要结合实际。 一、Windows安装Redis Redis的解压包我放在了百度网盘上&#xff0c;有需要的可以下载。 R…

【第七篇】使用BurpSuite进行主动、被动扫描和主动、被动爬虫

文章目录 前言主动扫描被动扫描主动爬虫被动爬虫前言 Burp Scanner 既可以用作全自动扫描仪,也可以用作增强手动测试工作流程的强大手段。 扫描网站涉及两个阶段: 抓取内容和功能: Burp Scanner 首先在目标站点周围导航,密切反映真实用户的行为。它对站点的结构和内容以及…

06 Php学习:字符串

PHP 中的字符串变量 在 PHP 中&#xff0c;字符串是一种常见的数据类型&#xff0c;用于存储文本数据。字符串变量可以包含字母、数字、符号等字符&#xff0c;并且可以进行各种操作和处理。以下是关于 PHP 中字符串变量的一些重要信息&#xff1a; 定义字符串变量&#xff1…

Spring boot 入门 ---(一),2024年最新java进阶训练营

spring-snapshots http://repo.spring.io/snapshot spring-milestones http://repo.spring.io/milestone spring-boot-starter-parent是使用Spring Boot的一种不错的方式&#xff0c;但它 并不总是最合适的。有时你可能需要继承一个不同的父POM&#xff0c;或只是不喜欢我…

JVM面试整理--对象的创建和堆

文章目录 对象的创建过程是怎样的?对象在内存中的结构是怎样的&#xff08;专业的叫法&#xff1a;对象的内存布局&#xff09;对象在内存分配时使用的哪种方式&#xff08;有的地方也称为&#xff1a;分配算法&#xff09;知道什么是“指针碰撞”吗&#xff1f;知道什么是“空…