1103. Integer Factorization (30)
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 2
Sample Output 1:
169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2
Sample Input 2:
169 167 3
Sample Output 2:
Impossible
1 #include<stdio.h> 2 #include<string> 3 #include<iostream> 4 #include<string.h> 5 #include<sstream> 6 #include<vector> 7 #include<map> 8 #include<stdlib.h> 9 #include<queue> 10 #include<math.h> 11 #include<set> 12 using namespace std; 13 14 int k,p; 15 int MAX = -1; 16 vector<int> re; 17 void DFS(vector<int>& vv,int n) 18 { 19 if(vv.size() == k ) 20 { 21 if(n == 0) 22 { 23 int sum = 0; 24 for(int i = 0 ;i < k;++i) 25 sum += vv[i]; 26 if(sum >= MAX) // 需要等号,可使得 sequence { a1, a2, ... aK } is said to be larger than { b1, b2, ... bK } i 27 { 28 MAX = sum; 29 re = vv; 30 } 31 } 32 vv.pop_back(); 33 return; 34 } 35 int low = vv.size() == 0 ? 1 : vv[vv.size() -1];//剪枝 使得只有增序情况 36 int m = sqrt(double(n)); 37 for(int i = low ; i <= m;++i) 38 { 39 int tmp = pow(double(i),p); 40 if(n >= tmp) 41 { 42 vv.push_back(i); 43 DFS(vv,n-tmp); 44 }else break; 45 } 46 if(!vv.empty()) 47 vv.pop_back(); 48 } 49 50 int main() 51 { 52 int n; 53 scanf("%d%d%d",&n,&k,&p); 54 vector<int> vv; 55 DFS(vv, n); 56 if(re.empty()) 57 { 58 printf("Impossible\n"); 59 } 60 else 61 { 62 printf("%d = %d^%d",n,re[re.size()-1],p); 63 for(int i = re.size() - 2;i >= 0;--i) 64 { 65 printf(" + %d^%d",re[i],p); 66 } 67 printf("\n"); 68 } 69 return 0; 70 }