2787. 将一个数字表示成幂的和的方案数

给你两个整数 n 和 x 。

请你返回将 n 表示成一些 互不相同 正整数的 x 次幂之和的方案数。换句话说,你需要返回互不相同整数 [n1, n2, ..., nk] 的集合数目,满足 n = n1x + n2x + ... + nkx 。

由于答案可能非常大,请你将它对 109 + 7 取余后返回。

比方说,n = 160 且 x = 3 ,一个表示 n 的方法是 n = 23 + 33 + 53 。

示例 1:

输入:n = 10, x = 2
输出:1
解释:我们可以将 n 表示为:n = 32 + 12 = 10 。
这是唯一将 10 表达成不同整数 2 次方之和的方案。

示例 2:

输入:n = 4, x = 1
输出:2
解释:我们可以将 n 按以下方案表示:
- n = 41 = 4 。
- n = 31 + 11 = 4 。

一、算法逻辑(逐步思路)

❓ 题目描述:

给定两个整数 nx,问:
有多少种方法可以用不同的正整数的 x 次幂相加,恰好等于 n

  • 每个整数最多使用一次(不能重复);
  • 返回方案数,结果对 10^9 + 7 取模。

✅ 解析过程:

1. 状态定义:
  • 定义 f[s] 表示和为 s 的组合数目
  • 初始化:f[0] = 1,表示选法为空时和为 0 的唯一方案。
2. 状态转移:
  • 对每个正整数 i,计算它的 x 次幂 v = i^x
  • 使用这个数能更新哪些和 s
    • 遍历 snv(倒序,防止重复使用);
    • 更新方式:f[s] += f[s - v]
      • 意思是:若当前组合中加入一个 v,使得和达到 s,那就看以前有多少种方法能组成 s - v
      • 相当于经典的0/1 背包模型(每个数最多使用一次)。
3. 终止条件:
  • 如果当前的 i^x > n,说明无法再用于任何组合,直接退出。
4. 返回值:
  • f[n] 表示最终组成 n 的合法组合数;
  • 对结果取模是为了防止整数溢出。

二、算法核心点

✅ 核心思想:0/1背包模型上的指数幂优化

  • 每个正整数 i 只能使用一次,对应背包问题中“每种物品最多取 1 次”;
  • 数字 v = i^x 就是物品的“体积”;
  • 每次用 f[s] += f[s - v] 实现状态转移;
  • 为避免重复计算、实现“每个数最多选一次”,必须倒序更新状态数组。

对应题目经典名称:

Perfect Powers Combination Problem(幂次组合计数)

class Solution:def numberOfWays(self, n: int, x: int) -> int:f = [1] + [0] * n  # 初始化DP数组:f[s] 表示组成和为 s 的方案数# 初始状态:f[0] = 1,表示“和为0”的方案就是啥也不选for i in range(1, n + 1):  # 枚举所有底数 i(1 到 n)v = i ** x  # 当前考虑的数是 i 的 x 次幂if v > n:   # 如果这个数太大,跳出循环break# 倒序遍历(0/1背包)从 n 到 vfor s in range(n, v - 1, -1):f[s] += f[s - v]  # 转移方程:将 v 加入组合中,组成 sreturn f[n] % 1_000_000_007  # 返回最终和为 n 的方案数

三、复杂度分析

  • 时间复杂度:O(k × n)
    • k 是最多可以选择的整数个数(即 i 满足 i^x ≤ n);
    • 对每个合法 i,我们进行一次 O(n) 的遍历。
  • 空间复杂度:O(n)
    • 状态数组 f 长度为 n + 1

总结表:

维度

内容

✅ 思路逻辑

将问题转换为组合数问题,用 0/1 背包方式动态转移

✅ 核心技巧

每个数最多用一次(倒序遍历);幂次作为体积;经典 f[s] += f[s - v] 模型

✅ 时间复杂度

O(√n × n) 最多枚举 √n 个底数,每次遍历 n 个状态

✅ 空间复杂度

O(n) 一维 DP 数组

总结思路:

步骤内容
初始化 f[0] = 1和为 0 有 1 种方式(空集)
枚举 i = 1...n将 i 的 x 次幂作为候选数
倒序更新 DP 数组保证每个数最多用一次(0/1背包)
更新 f[s] += f[s - v]表示:新方案 = 旧方案 + 使用 v 的方案
取模避免大数溢出

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

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

相关文章

C#常用的LinQ方法

LINQ(Language Integrated Query)是 .NET 中用于处理集合的强大工具,它提供了多种方法来简化数据查询和操作。以下是一些常用的 LINQ 方法及其功能:Where: 根据指定的条件筛选集合中的元素。var filteredResults matchResults.Wh…

目标检测之数据增强

数据翻转,需要把bbox相应的坐标值也进行交换代码:import random from torchvision.transforms import functional as Fclass Compose(object):"""组合多个transform函数"""def __init__(self, transforms):self.transform…

DiffDet4SAR——首次将扩散模型用于SAR图像目标检测,来自2024 GRSL(ESI高被引1%论文)

一. 论文摘要 合成孔径雷达(SAR)图像中的飞机目标检测是一项具有挑战性的任务,由于离散的散射点和严重的背景杂波干扰。目前,基于卷积或基于变换的方法不能充分解决这些问题。 本文首次探讨了SAR图像飞机目标检测的扩散模型&#…

html案例:编写一个用于发布CSDN文章时,生成有关缩略图

CSDN博客文章缩略图生成器起因:之前注意到CSDN可以随机选取文章缩略图,但后来这个功能似乎取消了。于是我想调整一下缩略图的配色方案。html制作界面 界面分上下两块区域,上面是参数配置,下面是效果预览图。参数配置: …

lightgbm算法学习

主要组件 Boosting #mermaid-svg-1fiqPsJfErv6AV82 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1fiqPsJfErv6AV82 .error-icon{fill:#552222;}#mermaid-svg-1fiqPsJfErv6AV82 .error-text{fill:#552222;stroke:#…

安卓基于 FirebaseAuth 实现 google 登录

安卓基于 FirebaseAuth 实现 google 登录 文章目录安卓基于 FirebaseAuth 实现 google 登录1. 前期准备1.1 创建 Firebase 项目1.2 将 Android 应用连接到 Firebase1.3 在 Firebase 控制台中启用 Google 登录2. 在 Android 应用中实现 Google 登录2.1 初始化 GoogleSignInClien…

李宏毅(Deep Learning)--(三)

一.前向传播与反向传播的理解:二.模型训练遇到的问题在模型训练中,我们可能会遇到效果不好的情况,那么我们应该怎么思考切入,找到问题所在呢?流程图如下:第一个就是去看训练的损失函数值情况。如果损失较大…

android studio 运行,偶然会导致死机,设置Memory Settings尝试解决

1、android studio导致死机 鼠标不能动,键盘没有反应,只能硬重启,但是内存并没有用完,cpu也不是100% 2、可能的原因 android studio内存设置的问题,为了限制占用内存,所以手工设置内存最小的一个&#x…

HTB 赛季8靶场 - Outbound

Rustscan扫描我们开局便拥有账号 tyler / LhKL1o9Nm3X2,我们使用rustscan进行扫描 rustscan -a 10.10.11.77 --range 1-65535 --scan-order "Random" -- -A Web服务漏洞探查 我们以账号tyler / LhKL1o9Nm3X2登录webmail,并快速确认版本信息。该…

动态组件和插槽

[Vue2]动态组件和插槽 动态组件和插槽来实现外部传入自定义渲染 组件 <template><!-- 回复的处理进度 --><div v-if"steps.length > 0" class"gain-box-header"><el-steps direction"vertical"><div class"l…

Unreal5从入门到精通之如何实现UDP Socket通讯

文章目录 一.前言二.什么是FSocket1. FSocket的作用2. FSocket关键特性三.创建Socket四.数据传输五.线程安全六.UDPSocketComponentUDPSocketComponent.hUUDPSocketComponent.cpp七.SocketTest测试八.最后一.前言 我们在开发UE 的过程中,会经常使用到Socket通讯,包括TCP,UD…

UI前端大数据处理新趋势:基于边缘计算的数据处理与响应

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;前端大数据的 “云端困境” 与边缘计算的破局当用户在在线文档中实时协作…

Reading and Writing to a State Variable

本节是《Solidity by Example》的中文翻译与深入讲解&#xff0c;专为零基础或刚接触区块链开发的小白朋友打造。我们将通过“示例 解说 提示”的方式&#xff0c;带你逐步理解每一段 Solidity 代码的实际用途与背后的逻辑。Solidity 是以太坊等智能合约平台使用的主要编程语…

c# 深度解析:实现一个通用配置管理功能,打造高并发、可扩展的配置管理神器

文章目录深入分析 ConfigManager<TKey, TValue> 类1. 类设计概述2. 核心成员分析2.1 字段和属性2.2 构造函数3. 数据加载机制4. CRUD 操作方法4.1 添加数据4.2 删除数据4.3 更新数据4.4 查询数据4.5 清空数据5. 数据持久化6. 设计亮点7. 使用示例ConfigManager<TKey, …

运维打铁: Python 脚本在运维中的常用场景与实现

文章目录引言思维导图常用场景与代码实现1. 服务器监控2. 文件管理3. 网络管理4. 自动化部署总结注意事项引言 在当今的 IT 运维领域&#xff0c;自动化和效率是至关重要的。Python 作为一种功能强大且易于学习的编程语言&#xff0c;已经成为运维人员不可或缺的工具。它可以帮…

【零基础入门unity游戏开发——unity3D篇】3D光源之——unity反射和反射探针技术

文章目录 前言实现天空盒反射1、新建一个cube2、全反射材质3、增加环境反射分辨率反射探针1、一样把小球材质调成全反射2、在小球身上加添加反射探针3、设置静态物体4、点击烘培5、效果6、可以修改反射探针区域大小7、实时反射专栏推荐完结前言 当对象收到直接和间接光照后,它…

React Three Fiber 实现 3D 模型点击高亮交互的核心技巧

在 WebGL 3D 开发中&#xff0c;模型交互是提升用户体验的关键功能之一。本文将基于 React Three Fiber&#xff08;R3F&#xff09;和 Three.js&#xff0c;总结 3D 模型点击高亮&#xff08;包括模型本身和边框&#xff09;的核心技术技巧&#xff0c;帮助开发者快速掌握复杂…

卷积神经网络实战:MNIST手写数字识别

夜渐深&#xff0c;我还在&#x1f618; 老地方 睡觉了&#x1f64c; 文章目录&#x1f4da; 卷积神经网络实战&#xff1a;MNIST手写数字识别&#x1f9e0; 4.1 预备知识⚙️ 4.1.1 torch.nn.Conv2d() 三维卷积操作&#x1f4cf; 4.1.2 nn.MaxPool2d() 池化层的作用&#x1f4…

HarmonyOS应用无响应(AppFreeze)深度解析:从检测原理到问题定位

HarmonyOS应用无响应&#xff08;AppFreeze&#xff09;深度解析&#xff1a;从检测原理到问题定位 在日常应用使用中&#xff0c;我们常会遇到点击无反应、界面卡顿甚至完全卡死的情况——这些都可能是应用无响应&#xff08;AppFreeze&#xff09; 导致的。对于开发者而言&am…

湖北设立100亿元人形机器人产业投资母基金

湖北设立100亿元人形机器人产业投资母基金 湖北工信 2025年07月08日 12:03 湖北 &#xff0c;时长01:20 近日&#xff0c;湖北设立100亿元人形机器人产业投资母基金&#xff0c;重点支持人形机器人和人工智能相关产业发展。 人形机器人产业投资母基金由湖北省财政厅依托省政府…