题解:P10959 月之谜

news/2024/9/19 9:24:13/文章来源:https://www.cnblogs.com/cly312/p/18416114

求一个区间内满足某种限制条件的数有多少个,是一个经典的数位 dp 问题。

\(f_{i,j,k,l}\) 表示由 \(i\) 位数字构成、各位数字之和是 \(j\)、对 \(k\) 取模余数是 \(l\) 的数有多少个。

在计算 \(f\) 时,允许前导 \(0\) 的存在,枚举第 \(i\) 位的数字 \(p\),得到状态转移方程:

\[f_{i,j,k,l} = \sum_{p=0}^{9} f_{i-1,j-p,k,(l - p \cdot 10^{i-1})\mod k} \]

闭区间 \([L, R]\) 种月之数的个数,等于 \([1, R]\) 种月之数的个数减去 \([1, L-1]\) 种月之数的个数。接下来以 \([1,R]\) 进行说明。

采取 “试填法” 的思想,从高位到低位给每一位填数,只要填了一个比上限 \(R\) 小的数位,那么后边的数位无论是多少,整个数值都不会超过 \(R\),此时就可以立即把 dp 预处理出的结果累加到答案中。只有在每一位上始终填写与上限 \(R\) 相同的数字时,才需要继续向后扫描,所以最终的计算量是数值的 “位数” 级别的,非常小。

我们枚举最终的各位数字之和 \(sum\),然后从左到右扫描每个数位,设当前正在处理第 \(i\) 位(最高位为第 \(N\) 位,最低位为第 \(1\) 位),当前已经填写的数字之和是 \(t\),当前数值对 \(sum\) 取模余数是\(q\),我们从小到大枚举第 \(i\) 位要填的数字 \(p\)

\(p\) 小于上限 \(R\) 在第 \(i\) 位上的数字,则后边 \(i - 1\) 位可以随便填,因为最终的数值能被 \(sum\) 整除,所以第 \(1 \sim i\) 位构成的数值对 \(sum\) 取模的余数应该是 \(sum - q\),因此答案直接累加 \(f_{i-1,sum-t-p,sum,(sum-q-p \cdot 10^{i-1}) \mod sum}\)

否则,令 \(t = t + p, q = q + p \cdot 10^{i-1} \mod sum\),开始处理第 \(i-1\)\([1, L-1]\) 同理。

代码:

#include<bits/stdc++.h>
using namespace std;
const int SIZE=1e5+10;
int L,R;
int dp[12][85][85][85],s[85][10]; 
int num[12];int val(int pos,int sum,int mod,int x,bool flag) {if(x<sum) return 0;if(!flag) return dp[pos+1][x][x-sum][(x-mod)%x]; if(pos==-1) return (mod==0&&sum==x);int res=0;for(int d=0; d<=num[pos]; d++) {bool e=(d==num[pos]);res+=val(pos-1,sum+d,(mod+(s[x][pos])*d)%x,x,e);}return res;
}int Calc(int x) {int len=0,res=0;while(x) num[len++]=x%10,x/=10;for(int i=1; i<=81; i++) res+=val(len-1,0,0,i,true);return res;
}void pre() {for(int i=1; i<=81; i++) {memset(dp[0][i],0,sizeof(dp[0][i]));dp[0][i][0][0]=1;s[i][0]=1%i;for(int j=1; j<=9; j++) s[i][j]=(s[i][j-1]*10)%i;for(int j=1; j<=9; j++)for(int k=0; k<=j*9; k++)for(int p=0; p<=i; p++)for(int q=0; q<=9&&k>=q; q++) dp[j][i][k][p]+=dp[j-1][i][k-q][((p-s[i][j-1]*q)%i+i)%i];}
}int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);pre();while(cin>>L>>R) cout<<Calc(R)-Calc(L-1)<<endl;return 0;
}

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

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

相关文章

Thinkphp在线客服系统源码多语言外贸版_PHP客服系统源码Uniapp开发搭建+论文设计

在线客服系统是现代企业与客户沟通的重要工具,它不仅能够提升客户满意度,还能有效提高企业的工作效率。本文将详细介绍在线客服系统的源码开发搭建过程,包括需求分析、技术选型、系统架构设计、关键模块实现、测试与优化等各个环节,并辅以代码实例,帮助读者深入理解并实践…

『模拟赛』CSP-S加赛1

『模拟赛记录』CSP-S加赛1Rank 一般A. 小W与伙伴招募 仔细想了想,发现是贪心题。 赛时想了跟正解完全有些不太一样的做法,被顶针说假了,但其实开了 long long 能有 80pts。后来发现如果思路正确打 \(\mathcal{O(nm)}\) 的暴力能有 95pts。《对于 60% 的数据》考虑正解的贪法…

多线程六-线程通信之Condition使用与设计猜想

海上生明月,天涯共此时。愿大家在这个团圆的夜晚,收获满满的温馨和喜悦,团圆美满,中秋快乐!使用示例 ConditionDemoAwait :开始之后加锁,阻塞并释放锁 package com.caozz.demo5.concurrent;import java.util.concurrent.locks.Condition; import java.util.concurrent.lo…

[GXYCTF2019]BabyUpload 1

打开靶机,上传文件抓包 后缀不能带ph,大小写也无法绕过,意味着phtml后缀也无法上传对后缀只过滤ph,我们转变思路上传图片马,用.htaccess使图片马以php格式打开 上传图片马上传失败,试一试过滤了哪些字符 文件内容过滤了<?我们尝试另一种写法后成功上传<script lan…

DeepinV23安装Dotnet8

步骤: 第一步: 1.下载压缩包,2安装配置 第二步: 2准备工作:激活ROOT账号,重置密码解压目录:/home/bizuser/soft/dotnet/dotnet81.下载 直接🔗 https://download.visualstudio.microsoft.com/download/pr/14951030-5b4e-45ce-af0b-3d4aa613a70b/25acaeb050bbba6950a559…

高级Java程序员必备的技术点:你准备好了吗?

在Java编程的世界里,成为一名高级程序员不仅需要深厚的基础知识,还需要掌握一系列高级技术和最佳实践。这些技术点是通向技术专家之路的敲门砖,也是应对复杂项目挑战的利器。本文将探讨高级Java程序员必备的技术点,帮助你自我提升,迈向更高的职业巅峰。深入理解Java虚拟机…

无限debugger的解决----(一)

在尝试打开控制台时,遇到了这个问题,页面陷入无限debuuger。尝试(一)在debugger这一行点击Never pause here 也就是从不在此处暂停,但之后发现没用,关掉一个又出现一个。之后我又尝试了设置进入断点的条件,这个可以在调试过程中,期望某个变量的值大于某个具体的值的时候才停下来…

【USB3.0协议学习】Topic3三种Reset Events分析

USB3.0中的三种Reset Events 1. PowerOn Reset PowerOn Reset被用来代指上电复位,当一个device接入到root hub或者外置hub的时候,该device检测到Vbus信号从无效变为有效,会自动执行复位。(注意,self powered device不通过Vbus供电,但是Vbus发生转变的时候它同样会执行复位…

02策略模式

定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户而变化1. 案例:营业员根据客户所购买商品的单价和数量,根据不同活动向客户收费**- 正常原价收费 - 八折收费 - 满300返100 2. 策略模式结构- 抽象策略类(Stategy):声明算法…

三、浅层神经网络

1、神经网络概览什么是神经网络?如下图:神经网络的结构与逻辑回归类似,只是神经网络的层数比逻辑回归多一层,多出来的中间那层称为隐藏层或中间层。从计算上来看,神经网络的正向传播和反向传播比logistic回归多了一次重复的计算。引入新的标签:方括号上标[i]表示当前所处…

windows安装rabbitmq后出现:Error::plugins_dir_does not_exist

安装的路径正常,没有空格中文字符啥的。 环境变量也配置了。原因是:安装otp_win64_24.1.7时没有选择以管理员身份运行。重新卸载安装即可

Zero-Shot,One-Shot,Few-Shot,In-Context Learning

Zero-Shot,One-Shot,Few-Shot,In-Context Learning https://blog.csdn.net/weixin_44212848/article/details/139902394In-Context Learning定义:In-context learning是一种在不显式微调模型权重的情况下,通过给模型提供相关的上下文信息(例如提示或样本)来实现模型性能…