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.
Input Specification:
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.
Output Specification:
For each case, if the solution exists, output in the format:
1
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.
n, k, p = list(map(int, input().split())) ans, maxFacSum = [], 0 sums, facSums, now = 0, 0, []
defDFS(index): global sums, facSums, now, ans, maxFacSum, n, k, p if sums > n or len(now) > k or index == 0: return if sums == n and len(now) == k and facSums > maxFacSum: maxFacSum = facSums ans = now.copy() return
int n, k, p; int maxFacSum, facSums, sums; vector<int> ans, now;
intDFS(int index){ if (sums > n or now.size() > k or index == 0) return0; if (sums == n and now.size() == k and facSums > maxFacSum) { maxFacSum = facSums; ans = now; return0; } now.push_back(index); sums += pow(index, p); facSums += index; DFS(index); now.pop_back(); // 回溯 sums -= pow(index, p); facSums -= index; DFS(index - 1); }
intmain(){ cin >> n >> k >> p; DFS(int(pow(n, 1.0 / p))); if (!ans.empty()) { printf("%d = ", n); for (int i = 0;i<ans.size();i++) { if (i!= ans.size()-1) printf("%d^%d + ", ans[i], p); else printf("%d^%d\n", ans[i], p); } } else printf("Impossible"); }