题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224
题目描述
The K−P factorization of a positive integer N is to write N as the sum of the P-th power of K positive integers. You are supposed to write a program to find the K−P factorization of N for any positive integers N, K and P.
输入
Each input file contains one test case which gives in a line the three positive integers N (≤400), K (≤N) and P (1<P≤7). The numbers in a line are separated by a space.
输出
For each case, if the solution exists, output in the format:
N = n[1]^P + … n[K]^P
where n[i] (i = 1, …, K) is the i-th factor. All the factors must be printed in non-increasing order.
Note: the solution may not be unique. For example, the 5-2 factorization of 169 has 9 solutions, such as 122 +42 +22 +22 +12 , or 112 +62 +22 +22 +22 , or more. You must output the one with the maximum sum of the factors. If there is a tie, the largest factor sequence must be chosen – sequence { a1 ,a2 ,⋯,aK } is said to be larger than { b1 ,b2
,⋯,bK } if there exists 1≤L≤K such that ai =bi for i<L and aL >bL .
If there is no solution, simple output Impossible.
样例输入
169 5 2
样例输出
169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2
代码
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int n, k, p, maxFacSum = -1;
vector<int> v, ans, tempAns;
void init() {
int temp = 0, index = 1;
while (temp <= n) {
v.push_back(temp);
temp = pow(index, p);
index++;
}
}
void dfs(int index, int tempSum, int tempK, int facSum) {
if (tempK == k) {
if (tempSum == n && facSum > maxFacSum) {
ans = tempAns;
maxFacSum = facSum;
}
return;
}
while(index >= 1) {
if (tempSum + v[index] <= n) {
tempAns[tempK] = index;
dfs(index, tempSum + v[index], tempK + 1, facSum + index);
}
if (index == 1) return;
index--;
}
}
int main() {
scanf("%d%d%d", &n, &k, &p);
init();
tempAns.resize(k);
dfs(v.size() - 1, 0, 0, 0);
if (maxFacSum == -1) {
printf("Impossible");
return 0;
}
printf("%d = ", n);
for (int i = 0; i < ans.size(); i++) {
if (i != 0) printf(" + ");
printf("%d^%d", ans[i], p);
}
return 0;
}