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:
N = n1^P + ... nK^P
where ni (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".
Sample Input 1:169 5 2Sample Output 1:
169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2Sample Input 2:
169 167 3Sample Output 2:
Impossible
题意看一下数据应该能看懂
因为数据比较小,所以直接dfs暴力搜索 + 剪枝 就行了
dfs(int start, int x, int step) //start为此时的系数, x为N剩下的值, step为系数的个数
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <string> #include <cmath> #include <set> #include <queue> #include <algorithm> #include <vector> const double PI = acos(-1.0); using namespace std; #define esp 1e-8 int n, k, p; int a[500]; int b[500], tot, temp; int power(int a, int b) { int ans = 1; while(b) { if(b & 1) ans = a * ans; b >>= 1; a = a * a; } return ans; } void dfs(int start, int x, int step) { x -= power(start, p); b[step ++] = start; if(step == k && x == 0) { int s = 0; for(int i = 0; i < step; ++ i) { s += b[i]; } if(s >= a[k]) //如果系数和比前面的大就替换掉 { for(int i = 0; i < step; ++ i) { a[i] = b[i]; } temp = 1; } a[k] = s;把和保存在a[k] return; } if(x <= 0 || step >= k) { return ; } for(int i = start; power(i, p) <= x; ++ i) { if((i * (k - step)) > x) //注意剪枝 break; dfs(i, x, step); } return; } int main() { int i, j; while(~scanf("%d%d%d", &n, &k, &p)) { temp = 0; for(i = 1; power(i, p) <= n; ++ i) { dfs(i, n, 0); } if(temp == 0) printf("Impossible\n"); else { int mm = 0; int res = 0; sort(a, a + k + 1); printf("%d =", n); for(i = k - 1; i >= 0; -- i) { if(i != k - 1) printf(" +"); printf(" %d^%d", a[i], p); } printf("\n"); } } }