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
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
If there is no solution, simple output Impossible
.
169 5 2
169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2
169 167 3
Impossible
dfs+剪枝,个数大于k,平方和大于n时直接return
#include
#include
using namespace std;
int n, k, p, maxx;
int m[500], ans[500], temp[500];
bool flag;
int power(int a, int b) { //快速幂
int t = 1;
while (b > 0) {
if (b & 1) {
t *= a;
}
a *= a;
b >>= 1;
}
return t;
}
void dfs(int ind, int cnt, int sum, int order) { //当前数,当前平方和,当前和,当前第几个数
if (order > k) {
return;
}
if (cnt + m[ind] > n) {
return;
}
if (cnt + m[ind] == n && order == k) {
sum += ind;
temp[order] = ind;
flag = 1;
if (sum > maxx) {
maxx = sum;
for (int i = 1; i <= order; i++) {
ans[i] = temp[i];
}
} else if (sum == maxx) {
bool f = 0;
for (int i = 1; i <= k; i++) {
if (temp[i] < ans[i]) {
f = 1;
break;
}
}
if (!f) {
for (int i = 1; i <= k; i++) {
ans[i] = temp[i];
}
}
}
} else {
sum += ind;
cnt += m[ind];
temp[order] = ind;
for (int i = ind; i >= 1; i--) {
dfs(i, cnt, sum, order + 1);
}
}
}
int main() {
cin >> n >> k >> p;
for (int i = 0; i <= sqrt(n); i++) {
m[i] = power(i, p);
}
for (int i = sqrt(n); i >= 1; i--) {
dfs(i, 0, 0, 1);
}
if (!flag) {
cout << "Impossible";
return 0;
}
cout << n << " = ";
for (int i = 1; i <= k; i++) {
printf("%d^%d", ans[i], p);
if (i != k) {
printf(" + ");
}
}
return 0;
}