PAT 1103 Integer Factorization
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#include <cstdio> #include <cstring> #include <cmath> #include <iostream> using namespace std; int re[21]; int s[400],t[400]; int n,k,p; int flag,Max=-1; void Print(){ printf("%d",n); for(int i=0;i<k;i++){ printf(" %c %d^%d",i==0?'=':'+',t[i],p); } cout<<endl; } void dfs(int loc,int sum,int sumFactor,int step){ if(sum>n){ return; } if(step==k){ if(sum<n||sumFactor<Max){ return; } if(sumFactor==Max){ for(int i=0;i<k;i++){ if(s[i]<t[i]){ return; } } } flag=1; Max=sumFactor; for(int i=0;i<k;i++){ t[i]=s[i]; } return; } for(int i=loc;i>=1;i--){ s[step]=i; dfs(i,sum+re[i],sumFactor+i,step+1); } } int main(){ cin>>n>>k>>p; for(int i=1;i<=20;i++){ re[i]=(int)pow(i,p); } for(int i=20;i>=1;i--){ s[0]=i; dfs(i,re[i],i,1); } if(!flag){ cout<<"Impossible"<<endl; } else{ Print(); } return 0; }