2787. 将一个数字表示成幂的和的方案数
Problem: 2787. 将一个数字表示成幂的和的方案数
文章目录
- 思路
- 解题过程
- 复杂度
- Code
思路
动态规划01背包
解题过程
- 用
dp[j]
表示“从已经处理过的数里,凑出和为 j 的方案数”。 - 遍历数字
i
的时候,从j = n
倒着更新到val(val = i^x)
,dp[j] = (dp[j] + dp[j - val]) % mod
。
复杂度
- 时间复杂度: O(nnx)O(n\sqrt[x]{n})O(nxn)
- 空间复杂度: O(n)O(n)O(n)
Code
class Solution {
public:int numberOfWays(int n, int x) {const long long MOD = 1e9 + 7;vector<long long> dp(n + 1);dp[0] = 1;for (int i = 1; i <= n; i++) {long long val = pow(i, x);if (val > n) {break;}for (int j = n; j >= val; j--) {dp[j] = (dp[j] + dp[j - val]) % MOD;}}return dp[n];}
};