当前位置: 首页 > news >正文

【数位DP】D. From 1 to Infinity

Problem - D - Codeforces

题目:

思路:

数位DP + 数论

题目让我们求这个无限序列 123456789101112.... 的前 k 个数的数位和

题目看起来很不好求,事实上确实是这样的

我们可以先从简单问题开始

问题①. 求 k 位置对应着第几个数

那么显然我们很好求出这个数,首先每一位的数都有  9*wei*10^{wei-1} 个数位,比如两个位数就有 9 * 10 个数,每一个数都有两位,那么就是有 9 * 10 * 2 位

因此我们可以不断计算求出一个 wei,其代表 k 处于有 wei 位数字,那么现在求 k 是其中的第几个,那么此时一个数要占据 wei 位,所以 k 个数就能往后 k / wei 个数了,但是要注意我们从下标 0 开始数的,因此 k 要减一,防止多计算了

所以 k 处于的数就是 10^{wei-1}+num,其中 num 代表往后几位

那么对于这个数也很好求了,我们直接转为字符串计算即可

问题②. 计算 1 ~ n 的所有数位和

这个问题我们可以使用数位dp来解决,虽然也能用过其他的递归+数学解决,但是练习数位dp也是挺好的

我们定义 f[i] 为第 i 位能所有数的数位和,g[i] 为第 i 位时为能构成的数的数量,然后套板子即可,具体实现看代码,还是很简单的

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define yes cout << "YES\n"
#define no cout << "NO\n"
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());int getans(int n)
{string a = to_string(n);int m = a.size();vector<int> f(m,-1),g(m,-1);auto dfs = [&](auto && self,int now,int lim,int zero)->pair<int,int>{if(now == m){return {0,1};}if(!lim && !zero && f[now] != -1) return {f[now],g[now]};int mx = lim ? (a[now] - '0') : 9;int res = 0,cnt = 0;for (int i = 0; i <= mx; i++){auto [ans,num] = self(self,now+1,lim && i == mx,zero && i == 0);res += ans + num * i;cnt += num;}   if(!lim && !zero){f[now] = res;g[now] = cnt;}return {res,cnt};};return dfs(dfs,0,1,1).first;
}   void solve()
{int k;cin >> k;int wei = 1;while (wei * 9 * pow(10, wei - 1) <= k){k -= wei * 9 * pow(10, wei - 1);wei++;}int num = (k - 1) / wei; // 往后多少个数,减一防止多偏移,如 wei = 2,k = 2,那么此时如果不减则 k / wei = 1,即往后一位,算出来位 11,实际上是 10int n = pow(10, wei - 1) + num;string s = to_string(n);int ans = 0;for (int i = 0; i <= (k - 1) % wei; i++) //(k - 1) % wei 第 n 个数其包含了多少位{ans += s[i] - '0';}ans += getans(n - 1);cout << ans << endl;
}signed main()
{ios::sync_with_stdio(false);cin.tie(nullptr);int t = 1;cin >> t;while (t--){solve();}return 0;
}

http://www.dtcms.com/a/347601.html

相关文章:

  • 数据库字段类型深度解析:从关系型到 NoSQL 的全面指南
  • Placement new是什么
  • CUDA和torch的安装
  • 【LeetCode】363. 矩形区域不超过 K 的最大数值和 (二分 + 前缀和)
  • 拓扑排序|hash
  • 深入剖析Spring Boot应用启动全流程
  • MySQL GPG 密钥更新问题解决文档
  • Centos7.9 Docker26容器化部署 MySql9.4 一主一从的同步复制部署
  • 【51单片机非精准延时演示来回流水灯效果】2022-11-10
  • 【机器学习深度学习】自然语言与多模态大模型
  • 【KO】前端面试一
  • git的工作使用中实际经验
  • 关于Highcharts的数据参考与产品系列
  • Camera performance analysis
  • 智能系统与未来生态演进初步思考
  • 告别图片背景违和!autohue.js 让图片与背景自动 “无缝衔接”
  • 基于51单片机自动智能浇花系统设计
  • 【序列晋升】13 Spring Cloud Bus微服务架构中的消息总线
  • 研究生方向:在传统赛道与交叉领域间寻找破局之路
  • 第三阶段数据库-2:数据库中的sql语句
  • 重审文字的本体论地位:符号学转向、解构主义突围与视觉性革命
  • 1电吉他环境搭建:效果器再探
  • C++算法题—— 小C的细菌(二维偏序离线 + 树状数组 + 坐标压缩)
  • [激光原理与应用-328]:结构设计 - Solidworks - 什么是结构建模?
  • PCB电路设计学习3 电路原理图设计 元件PCB封装设计与添加
  • 学习嵌入式第三十六天
  • 神经网络|(十三)概率论基础知识-贝叶斯公式和全概率公式
  • More Effective C++ 条款04:非必要不提供默认构造函数
  • c++string
  • 【计算机网络 | 第8篇】编码与调制