scoi - 2013 -- 数数题解(这道题是一个非常好的数位dp题)

目录

[SCOI2013]数数

题目描述

输入描述:

输出描述:

输入

输出

说明

思路:

代码实现:


[SCOI2013]数数

 

G-[SCOI2013]数数_牛客竞赛动态规划专题班数位dp练习 (nowcoder.com)
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩。 他数数玩的具体规则是:

1. 确定数数的进制B 

2. 确定一个数数的区间[L, R]

3. 对于[L, R] 间的每一个数,把该数视为一个字符串,列出该字符串的每一个(连续的)子串对应的B进制数的值。

4. 对所有列出的数求和。

现在Fish 数了一遍数,但是不确定自己的结果是否正确了。由于[L, R] 较大,他没有多余精力去验证是否正确,你能写一个程序来帮他验证吗?    

输入描述:

输入包含三行。
第一行仅有一个数B,表示数数的进制。
第二行有N +1 个数,第一个数为N,表示数L在B 进制下的长度为N,接下里的N个数从高位到低位的表示数L 的具体每一位。
第三行有M+ 1 个数,第一个数为M,表示数R 在B 进制下的长度为M,接下里的M个数从高位到低位的表示数R 的具体每一位。
20% 数据,0 ≤ R ≤ L ≤ 10^5。
50% 数据,2  ≤ B  ≤ 1000,1  ≤ N,M ≤ 1000。
100% 数据,2  ≤ B ≤  10^5,1 ≤  N,M ≤ 10^5。

输出描述:

输出仅一行,即按照Fish 数数规则的结果,结果用10 进制表示,由于该数可能很大,输出该数模上20130427的模数。

示例1

输入

复制10 3 1 0 3 3 1 0 3

10
3 1 0 3
3 1 0 3

输出

复制120

120

说明

Hint
[103, 103] 之间仅有数103,该数的所有子串包括1, 10, 103, 0, 03, 3,其和为120。

思路:

还是用数位dp的思路,计算0-r的值v1和0-l的值v2,然后利用v1-v2,因为他是输入的字符串,你计算l-1还要考虑它的位之类的很烦,那我们直接单独计算l的贡献值v3,则答案就为v1-v2+v3。

现在给出计算思路:

  1. 这一位填0,填0就只需要考虑当前填的0是否是先导0,如果是先导0则只需要统计下一位的贡献即可,如果不是先导0,则需要统计下一位的额外贡献。                                                   例如 1050 他的字串为 1 10 105 1050、 0 05 050、 5 50、 0,它下一位的贡献为55      (5*(1+10)),但是因为他不是先导0对0这位还有额外贡献55,也应该计算。                                                       例如 0050 他的子串为 5 50、 0,它就只有下一位的贡献为55,对上一位的0没有贡献。
  2. 这一位填1-x-1,填1-x-1的话,对下一位来说他就一定没有这位填数的大小的限制,即下一位可以填0-B-1,然后他的贡献是 x * (x-1)/2,还要考虑下一位的额外贡献,还要考虑这样的贡献(包括额外贡献的次数)能有多少次。                                                                               例如 12789,前两位填 11,则这一位的贡献为 10*9/2 * (1+10+100),后面的位共有100种可以搭配的选择,所以这一位的贡献为10*9/2 * (1+10+100)*100。(1+10+100)表示它在子串中可能出现的各种位置的贡献。
  3. 这一位填x,对下一位来说它有没有限制需要看这一位有没有限制,如果没有限制即下一位可以填0-B-1,否则它只能选择的情况为题目的数据大小,然后他的贡献是 x,还要考虑下一位的额外贡献,还要考虑这样的贡献能有多少次。这样的统计才是完整的。

代码实现:

   

public class Ex {static int N = 100010;static long[][][] dp = new long[N][2][2];static int len;static int B;static int[] l= new int[N];static int[] r = new int[N];static int[] arr = new int[N];static long[] pw = new long[N];static long[] s = new long[N];static long[] suf = new long[N];static int mod = 20130427;public static void main(String[] args) {Scanner input = new Scanner(System.in);B = input.nextInt();pw[1] = 1; s[1] = 1;for(int i = 2; i < N; i ++) {pw[i] = pw[i - 1] * B % mod;s[i] = (s[i - 1] + pw[i] ) % mod;}int n = input.nextInt();for(int i = 1; i <= n; i++) {l[i] = input.nextInt();}int m = input.nextInt();for(int i = 1; i <= m; i++) {r[i] = input.nextInt();}
//         System.out.println(solve(r, m));
//         System.out.println(solve(l, n));
//         System.out.println(get(l, n));System.out.println((solve(r, m) - solve(l, n) + mod+get(l,n)) % mod);}public static long get(int[] a, int n){long res = 0;for (int i = 1; i <= n; i++) {res = (res + (long) i * a[i] % mod * s[n - i + 1] % mod) % mod;}return res;}public static long solve(int[] a, int n){len = n;arr = a;for (int i = 0; i < N; i++) {for (int j = 0; j < 2; j++) {Arrays.fill(dp[i][j], -1);}}suf[n + 1] = 0;for (int i = n; i >= 1; i--) {// 这里计算如果在有限制的情况下数据可能有多少种。即这样的贡献的贡献次数suf[i] = (suf[i + 1] + pw[n - i + 1] * arr[i] % mod) % mod; }return dfs(1, 1, false)[0];}public static long[] dfs(int pos, int pre, boolean flag) {if (pos > len) return new long[]{0,0};int x = flag ? B-1:arr[pos];if (flag && dp[pos][pre][0] != -1) return dp[pos][pre];long[] ans = new long[2];long[] tmp = dfs(pos + 1, pre, flag || x != 0); // 填0// tmp[0] 下一位的贡献, pre == 1 ? 0 : 1) * tmp[1] 如果不是先导0,这里应该有额外贡献ans[0] = (ans[0] + ((pre == 1 ? 0 : 1) * tmp[1]) + tmp[0]) % mod;ans[1] = (ans[1] + tmp[1]) % mod;if (x > 1) { //填 1 到 x - 1long xx = x - 1;long cnt = pw[len - pos + 1]; // 贡献次数tmp = dfs(pos + 1, 0, true);// s[len - pos + 1] * ( xx * x) / 2 % mod * cnt % mod 这一位提供的贡献// tmp[0] * xx % mod 下一位提供的贡献//  tmp[1] * xx % mod 下一位提供的额外贡献ans[0] = (ans[0] + s[len - pos + 1] * ( xx * x) / 2 % mod * cnt % mod + tmp[0] * xx % mod + tmp[1] * xx % mod) % mod;// 计算这一位能提供的额外贡献ans[1] = (ans[1] + s[len - pos + 1] * ( xx * x) / 2 % mod * cnt % mod + tmp[1] * xx % mod) % mod;}if (x > 0) { // 填xlong cnt = flag ? pw[len - pos + 1] : suf[pos + 1] + 1; // 贡献次数tmp = dfs(pos + 1, 0, flag);// 和上一个类似ans[0] = ((long) s[len - pos + 1] * x % mod * cnt % mod + ans[0] + tmp[0] + tmp[1]) % mod;ans[1] = ((long) s[len - pos + 1] * x % mod * cnt % mod + ans[1] + tmp[1]) % mod;}if (flag) dp[pos][pre] = ans;return ans;}}

           

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

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

相关文章

【开源项目】C#.NET 扩展库 -- Com.Gitusme.Net.Extensiones.Core

目录 1、项目介绍 2、集成方式 方法一&#xff1a;项目中通过Nuget包管理器安装导入 方法二&#xff1a;手动从Nuget官网下载&#xff0c;下载地址&#xff1a; 3、代码中导入命名空间 4、版本变更说明 1.0.7 版本 1.0.6 版本 1.0.5 版本 1.0.4 版本 5、演示示例 示…

45岁后,3部位“越干净”,往往身体越健康,占一个也要恭喜!

众所周知&#xff0c;人的生命有长有短&#xff0c;而我们的身体健康状态&#xff0c;也同样会受到年龄的影响&#xff0c;就身体的年龄层次而言&#xff0c;往往需要我们用身体内部的干净程度来维持&#xff0c;换句话说就是&#xff1a;若是你的身体内部越干净&#xff0c;那…

深度学习图像风格迁移 计算机竞赛

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

【问题思考总结】多维随机变量函数的分布的两种情况的计算方法【离连/连连】

问题 今天做李六第一套的时候发现&#xff0c;有的时候&#xff0c;面对这种第二问的题&#xff0c;很自然地就想到了Fz&#xff08;z&#xff09;&#xff0c;然后进行化简&#xff0c;但是有的时候&#xff0c;像这道题&#xff0c;就突然发现P{XY<z}是一个非常复杂的形式…

Vue中的深度监听Deep Watch

在Vue中&#xff0c;深度监听&#xff08;deep watching&#xff09;是指对对象或数组进行递归观察其变化的过程。这可以通过watch选项来实现。 当你想要监听一个对象或数组的每个属性或元素的变化时&#xff0c;Vue提供了deep选项。通过将deep设置为true&#xff0c;Vue会递归…

【从浅识到熟知Linux】基本指定之cat、more和less

&#x1f388;归属专栏&#xff1a;从浅学到熟知Linux &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;每日一句&#xff1a;写完这篇我要去吃晚饭啦&#xff01;&#xff01; 文章前言&#xff1a;本文介绍cat、more和less指令三种查看文件的用法并给出示例和截图…

Linux CentOS7 LVM

LVM&#xff08;Logical Volume Manger&#xff09;逻辑卷管理&#xff0c;Linux磁盘分区管理的一种机制&#xff0c;建立在硬盘和分区上的一个逻辑层&#xff0c;提高磁盘分区管理的灵活性。物理设备&#xff0c;是用于保留逻辑卷中所存储数据的存储设备。它们是块设备,可以是…

mac 修改 hosts 文件

打开 hosts 所在文件夹 command shift G 快捷键 输入&#xff1a;“/private/etc/hosts” 后回车 如下所示 进入 hosts 文件所在位置&#xff0c;找到 hosts 文件&#xff0c;双击打开 修改 hosts 文件 将所需要的配置信息追加到hosts 文件中&#xff0c;或者修改需要改…

Java串行化接口详解

引言 在 Java 开发中&#xff0c;我们经常需要将对象进行序列化和反序列化&#xff0c;以便在网络传输或存储到持久化介质中。Java 提供了一种机制&#xff0c;即通过实现 Serializable 接口来实现对象的串行化。本文将详细介绍 Java 串行化接口的用法和原理&#xff0c;以及一…

【md5】编码 、【timestamp】当前时间戳

对文本进行md5编码 使用md5对文本进行编码&#xff0c;可以使文本拥有唯一标识&#xff0c; from hashlib import md5 ii love y idmd5(str(i).encode(utf-8)).hexdigest() print("md5编码:",id)获取当前的可读性时间戳 import datetime current_time datetime.…

02 RANSAC算法 及 Python 实现

文章目录 02 RANSAC算法 及 Python 实现2.1 简介2.2 算法流程2.3 RANSAC 算法实现直线拟合2.4 利用 RANSAC 算法减少 ORB 特征点误匹配 02 RANSAC算法 及 Python 实现 2.1 简介 RANSAC &#xff08;Random Sample Consensus&#xff0c;随机抽样一致&#xff09;算法的 基本假…

LeetCode-805.保持城市天际线 C/C++实现 超详细思路及过程[M]

&#x1f388;归属专栏&#xff1a;深夜咖啡配算法 &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;记录一句&#xff1a;摆烂一天后&#xff0c;写的第一篇博客 文章目录 LeetCode-807. 保持城市天际线&#x1f697;题目&#x1f686;题目描述&#x1f686;题目示…

网站定制开发主要分类有哪些|企业 app 软件小程序定制

网站定制开发主要分类有哪些|企业 app 软件小程序定制 网站定制开发是指根据客户需求&#xff0c;为其量身定制设计和开发的网站服务。目前&#xff0c;网站定制开发主要分为以下几个分类&#xff1a; 1.静态网站定制开发&#xff1a;静态网站是由 HTML、CSS 和 JavaScript 等静…

Linux shell编程学习笔记29:shell自带的 脚本调试 选项

Linux shell脚本的调试方法比较多&#xff0c;上次我们探讨和测试了shell内建命令set所提供的一些调试选项&#xff0c;其实 shell 本身也提供了一些调试选项。我们以bash为例来看看。 1 bash 的命令行帮助信息&#xff08;bash --help&#xff09; purleEndurer csdn ~ $ ba…

华为ensp:trunk链路

当我们使用trunk链路后&#xff0c;还要选择要放行的vlan那就是全部vlan&#xff08;all&#xff09;&#xff0c;但是all并不包括vlan1&#xff0c;所以我们的trunk链路中的all不对all进行放行 实现相同vlan之间的通信 先将他们加入对应的vlan lsw1 进入e0/0/3接口 interfa…

mysql忘记密码,然后重置

数据库版本8.0.26 只针对以下情况 mysql忘记了密码&#xff0c;但是你navicat之前连接上了 解决方法&#xff1a; 第一步&#xff0c;选中mysql这个数据库&#xff0c;点击新建查询 第二步&#xff1a;重置密码 alter user rootlocalhost IDENTIFIED BY 你的密码; 然后就可…

基于单片机的智能鱼缸(论文+源码)

1.总体设计 在本次设计中&#xff0c;其系统整个框图如下图2.1所示。其主要的核心控制模块由单片机模块&#xff0c;LCD显示模块&#xff0c;喂食模块&#xff0c;蜂鸣器模块&#xff0c;按键模块&#xff0c;复位电路&#xff0c;抽水电路&#xff0c;加热电路&#xff0c;加…

Rust语言入门教程(三) - 函数与模块系统

函数 函数的定义 根据Rust的格式规范&#xff0c;函数名的格式应遵从蛇形命名法&#xff0c;即是用小写字母以及下划线组成&#xff0c;如&#xff1a; fn do_stuff(){ }Rust并不要求函数定义的位置必须在调用它之前&#xff0c;所以如果你习惯于把main函数放在最前面的话&a…

分享一个鬼~

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 先看效果&#xff1a; 上源码&#xff1a; import GUI from "https://cdn.jsdelivr.net/npm/lil-gui0.18.2/esm"const canv…

dat文件转换成excel教程

dat文件存在于很多的日用场合&#xff0c;为了更好的去进行办公使用&#xff0c;很多的用户都会将dat文件转换成excel&#xff0c;但是不知道怎么操作的却很多&#xff0c;下面来看看教程吧。 dat文件转换成excel&#xff1a; 1、首先打开excel&#xff0c;然后点击上面的“数…