首页 > 其他分享 >如何求出n之前的所有数满足位数和整数当前数?

如何求出n之前的所有数满足位数和整数当前数?

时间:2024-05-26 11:33:01浏览次数:16  
标签:填满 int lim 枚举 整数 满足 位数 dp 数位

见题:E - Digit Sum Divisible (atcoder.jp)

  P4127 [AHOI2009] 同类分布 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

考虑数位动规,设方程 $dp[i][j][k][l]$ 为状态:
$i$:搜到了第 $i$ 位(倒着枚举,也就是指 $i$ 到最高位都填完了)。

$j$: 表示当前的数位总和

$k$: 表示当前的数位总和模上我们枚举的数位和

$l$: 是否 $i$ 前面的位(包括 $i$)都填满了。这里的填满指填的与原数 $n$ 相同。例如 $114514$ 就是在 $n = 119198$ 时第五到最高位的填满。

那么状态转移方程就是:对于l=0,也就是当前位前面的没有被填满,那么我们在这个位置可以枚举到9

$f_{i, 0, k, l} = \sum\limits_{t = 0}^9 f_{i - 1,j + t, (10k + t) \bmod m, 0}$。表示枚举第 $i$ 位填的数为 $t$。那么因为前面存在某一位没填满,那么后面的位 $0 \sim 9$ 都是可以填的。因此 $t$ 的范围为 $[0, 9]$。

$f_{i, 1, k, l} = \sum\limits_{t = 0}^pf_{i - 1, j + t, (10k + t) \bmod m, [t == p]}$,其中 $p$ 表示给定的 $n$ 的第 $i$ 位,$[t = p]$ 表示 $t$ 是否等于 $p$(真为 $1$,假为 $0$)。表示枚举的第 $i$ 位为 $t$。那么因为前面每一位都填满了,那么这一位肯定不能超过 $n$ 原来的这一位,所以枚举到 $p$.

 

``` #include #define int long long using namespace std; const int N = 1e6 + 10, mod = 1e9 + 7; int dp[20][300][300][2], dep[20]; int dfs(int u, int s, int x, int k, int lim) { if (u == 0) return s == k && x == 0; if (dp[u][s][x][lim] != -1) return dp[u][s][x][lim]; int ed = lim ? dep[u] : 9; dp[u][s][x][lim] = 0; for (int i = 0; i <= ed; i++) dp[u][s][x][lim] += dfs(u - 1, s + i, (x * 10 + i) % k, k, lim && (i == ed)); return dp[u][s][x][lim]; } signed main() { std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int a, b; cin >> a >> b; int len = 0; a--; while (a) dep[++len] = a % 10, a /= 10; int res = 0; for (int i = 1; i <= 9 * 18; i++) { memset(dp, -1, sizeof dp); res += dfs(len, 0, 0, i, 1); } len = 0; while (b) dep[++len] = b % 10, b /= 10; int ans = 0; for (int i = 1; i <= 9 * 18; i++) { memset(dp, -1, sizeof dp); ans += dfs(len, 0, 0, i, 1); } cout << ans - res; return 0; } ```

标签:填满,int,lim,枚举,整数,满足,位数,dp,数位
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/18213472

相关文章

  • 整数与浮点数在内存中的存储
    整形数据类型的存储(通常存的是二进制的补码)大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,存储在内存的低地址处。小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,存储在内存的高地址处。 判断高低地址:int......
  • 动态地控制kafka的消费速度,从而满足业务要求
    kafka是一个分布式流媒体平台,它可以处理大规模的数据流,并允许实时消费该数据流。在实际应用中,我们需要动态控制kafka消费速度,以便处理数据流的速率能够满足系统和业务的需求。本文将介绍如何在kafka中实现动态控制消费速度的方法。1.消费者配置在Kafka中,消费者可以使用以下参......
  • 整数和浮点数在内存中的存储
    前言嗨,我是firdawn,在本章中我们将介绍,整数和浮点数在内存中的存储,以及大小端字节序,下面是本章的思维导图,下面让我们开始今天的学习吧!一,整数在内存中的存储1.1原码,反码,补码的概念我们知道计算机底层储存的其实是0和1组成的二进制序列,当我们储存一个有符号整数时,那它的......
  • C语言---试计算在区间1 到n 的所有整数中,数字x(0 ≤ x ≤ 9)共出现了多少次?
    #include<stdio.h>intmain(){intn,x;scanf("%d%d",&n,&x);intcount=0;for(inti=1;i<=n;i++){intm=i;//从1开始计算while(m)//循环运行的条件{if(m%10==x)//如果m除以10的余数是x的......
  • ShareStation工作站虚拟化实现图形工作站的一机多用,满足大型设计软件需求
    一、背景公司设计部需要使用大型的CAD/CAM软件进行设计。比如运行Siemens NX的工作站配置了i913900KF和NVIDIARTXA5000显卡。略微差一些的工作站,配置了A2000的显卡。还有一些相对老旧的工作站配置Q2000/Q2200的显卡。实际工作中,设计师的工作是分阶段的。有些设计......
  • ONENET平台的高精度定位数据上传
    调这个平台,没多少资料支持,折腾了几天,现在记录哈定位系统使用。先在这个平台,建一个设备,添加系统功能的,高精度定位。添加完后,可以发定位消息了,数据格式,打开详情按照标准例程的格式生成JOSN数据修改经纬达来发送定位消息在线工具经纬度定位|经纬度定位软件|经纬度定位工......
  • 满足 5G 通信的带宽需求,1ST040EH2F35I2LG,1ST085ES3F50I3VG,1ST085ES3F50E3VG,1ST110E
    说明Stratix®10FPGA和SoCFPGA大幅提高了性能、功效、密度和系统集成度。Stratix10采用创新HyperflexFPGA架构,将嵌入式多芯片互连桥接器(EMIB)、高级接口总线(AIB)和芯片组等技术结合在一起。™因此,与上一代高性能FPGA相比,Stratix10器件的性能提高了2倍。Stratix®10......
  • 什么样的数据摆渡设备,可以满足不同网间数据的安全传输需求?
    数据摆渡设备是用来在不同的网络环境间安全地传输数据的硬件或软件解决方案。它们通常用于确保在具有不同安全级别的网络(如内网和外网)之间进行数据交换时的安全性和合规性。以下是一些常见的数据摆渡设备和方法:移动介质拷贝:使用U盘或移动硬盘等移动介质进行数据拷贝,这是一种比较......
  • C++实现128位整数类
    如何编写一个128位的整数现在的大部分的计算机编程语言都包含了64位的有符号整数和无符号整数,有的甚至还提供了128位的整数和大数,比如:\(C\#\):System.Int128,System.UInt128\(Rust\):i128,u128但是在C/C++中并未发现uint128_t/int128_t,尽管在某些平台下可以看到__int1......
  • 2024-05-22:用go语言,你有一个包含 n 个整数的数组 nums。 每个数组的代价是指该数组中
    2024-05-22:用go语言,你有一个包含n个整数的数组nums。每个数组的代价是指该数组中的第一个元素的值。你的目标是将这个数组划分为三个连续且互不重叠的子数组。然后,计算这三个子数组的代价之和,要求返回这个和的最小值。输入:nums=[1,2,3,12]。输出:6。答案2024-05-22:cha......