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

洛谷P2518

题目大意

给定一个整数 \(n\),通过删除任意多个 \(0\),然后重新排列剩余数字,求能产生多少个比原数小的不同数。

分析

  1. 只能删除数字 \(0\),其他数字必须保留。
  2. 可以重新排列数字顺序。
  3. 生成的数不能有前导 \(0\)
  4. 要计算所有不同的比原数小的数。

我们可以从高位到低位逐位确定数字,使用组合数学计算方案数。

Solution

标签:数位DP

具体步骤

1. 统计数字出现次数

  • 记录原数中 \(0-9\) 每个数字出现的次数。
  • \(a[i]\) 表示数字i出现的次数。

2. 逐位比较

设原数 \(b[1..n]\)\(n\) 位,从第 \(1\) 位到第 \(n\) 位:

  • 对于当前位 \(b[i]\),考虑所有比它小的数字 \(j\)
  • 如果数字 \(j\) 还有剩余(\(a[j]\) > \(0\)),则可以放在这一位。
  • 放置j后,剩下的数字可以任意排列,计算排列数加到答案中。
  • 然后考虑这一位与原数相同的情况,继续处理下一位。

3. 计算排列数

  • 在某一位确定了一个数字后,剩下的数字可以自由排列。
  • 计算这些数字的全排列数,但要考虑重复数字。
  • 公式:\(m!\) / (\(a[0]!\) * \(a[1]!\) * ... * \(a[9]!\)),其中 \(m\) 是剩余数字总数。
  • 使用组合数 \(C(m, a[0])\) * \(C(m-a[0], a[1])\) * ...来计算。

时间复杂度

  • 组合数计算:杨辉三角递推法,使用记忆化,时间复杂度 \(O(n²)\)
  • 主循环:遍历每一位,最坏 \(O(n×10)\)
  • 总时间复杂度:\(O(n²)\)\(n≤50\),可以接受。

参考代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;ll c[521][521], a[520], b[1314], n;
string s;// 计算组合数C(x, y)
ll C(ll x, ll y) {if (c[x][y]) return c[x][y];if (y > x || y < 0 || x < 0) return 0;if (y == 1) return x;if (y == 0 || x == y) return 1;c[x][y] = C(x - 1, y - 1) + C(x - 1, y);return c[x][y];
}// 计算当前剩余数字的排列数
ll cnt() {ll m = n, ccnt = 1;for (ll i = 0; i <= 9; i++) {if (a[i]) {ccnt *= C(m, a[i]);  // 选择a[i]个位置放数字im -= a[i];           // 从剩余位置中减去已用位置}}return ccnt;
}int main() {cin >> s;// 统计每个数字出现次数,并保存原数每一位for (char ch : s) {ll num = ch - '0';a[num]++;     // 0到9的个数b[++n] = num; // 第i位是num}ll t = n, ans = 0;for (ll i = 1; i <= t; i++) {       // 逐位递推--n;                            // 当前位已确定,减少总位数for (ll j = 0; j < b[i]; j++) { // 枚举比b[i]小的数字if (a[j]) {                 // 如果该数字还有剩余a[j]--;                 // 使用一个jans += cnt();           // 计算排列数a[j]++;                 // 回溯,恢复状态}}a[b[i]]--; // 确定这一位与原数相同,继续处理下一位}cout << ans;return 0;
}
http://www.jsqmd.com/news/359260/

相关文章:

  • 【Docusarous】首页增加链接形式进入文档
  • Excel数据分析太慢?Python让你秒变报表大神,三天搞定一个月工作
  • AI系统灾备职业发展:架构师如何提升竞争力?
  • 为什么好心的金钱奖励,反而杀死了孩子的自律与热爱:人有两种动力:内在动机、外在动机。当强外在物质奖励,介入本身有内在动机的行为时,内在动机会被逐渐驱逐,行为最终依赖外部奖励,一旦奖励消失/不足,行为立
  • 洛谷P3857
  • 洛谷P3177
  • 洛谷P1896
  • 计算机小程序毕设实战-基于springboot+小程序的桂林旅游桂林源记小程序的设计与实现基于springboot桂林旅游景点导游平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 论文写作利器:6款AI工具打造专业级内容
  • Leetcode 剑指 Offer II 161. 连续天数的最高销售额
  • 【毕业设计】基于springboot+小程序的桂林旅游桂林源记小程序的设计与实现(源码+文档+远程调试,全bao定制等)
  • 别被名字吓到:锯齿迭代器(Zigzag Iterator)其实是个“很人性”的算法
  • 智能辅助:6款AI工具优化论文写作流程与成果
  • 小程序毕设选题推荐:基于springboot+小程序的医院挂号系统小程序基于SpringBoot智能在线预约挂号系统微信小程序【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 小程序计算机毕设之基于springboot+小程序的医院挂号系统小程序基于SpringBoot+微信小程序的微信医院挂号系统(完整前后端代码+说明文档+LW,调试定制等)
  • 适合小白的git的基础使用方法
  • 借助AI技术:6款工具让论文写作更轻松精准
  • 【计算机毕业设计案例】基于springboot的文化旅游小程序基于springboot+小程序的桂林旅游桂林源记小程序的设计与实现(程序+文档+讲解+定制)
  • 【计算机毕业设计案例】基于springboot+小程序的桂林旅游桂林源记小程序桂林旅游景点导游平台的设计与实现(程序+文档+讲解+定制)
  • 提升学术写作:6款AI工具助你高效完成论文
  • 【计算机毕业设计案例】基于JAVA+SpringBoot+MySQL+微信小程序的校园点餐系统基于springboot+小程序的校园点餐系统小程序的设计与实现(程序+文档+讲解+定制)
  • 论文写作新选择:6款AI工具实现高效与高质量
  • 洛谷P4035
  • 第一章使用Navicat创建数据库
  • 小程序毕设项目:基于springboot+小程序的桂林旅游桂林源记小程序的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 洛谷P2607
  • 我们去看看小明和小华交流什么神秘的C++项目吧
  • Visual Studio 2026新解决方案格式slnx详解
  • 你永远不知道用户会怎样使用你的软件
  • CF2155E