1103 Integer Factorization (30 分)
The K−PK-PK−P factorization of a positive integer NNN is to write NNN as the sum of the PPP-th power of KKK positive integers. You are supposed to write a program to find the K−PK-PK−P factorization of NNN for any positive integers NNN, KKK and PPP.
Each input file contains one test case which gives in a line the three positive integers NNN (≤400\le 400≤400), KKK (≤N\le N≤N) and PPP (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+1212^2 + 4^2 + 2^2 + 2^2 + 1^2122+42+22+22+12, or 112+62+22+22+2211^2 + 6^2 + 2^2 + 2^2 + 2^2112+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,⋯,aKa_1, a_2, \cdots , a_Ka1,a2,⋯,aK } is said to be larger than { b1,b2,⋯,bKb_1, b_2, \cdots , b_Kb1,b2,⋯,bK } if there exists 1≤L≤K1\le L\le K1≤L≤K such that ai=bia_i=b_iai=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
#include
#include
#include
#include
using namespace std;
int n,k,p;
int maxsum = -1;
vector a,b,v;
void dfs(int index,int ans,int cnt,int sum){
if(cnt == k){
if(ans == n && sum > maxsum){
b = a;
maxsum = sum;
}
return ;
}
while(index >= 1){
if(ans+v[index] <= n){
a[cnt] = index;
dfs(index,ans+v[index],cnt+1,sum+index);
}
index--;
}
}
int main(){
cin >> n >> k >> p;
int t=0,index = 1;
a.resize(k);
while(t <= n){
v.push_back(t);
t = pow(index,p);
index++;
}
dfs(v.size()-1,0,0,0);
if(maxsum == -1){
printf("Impossible\n");
return 0;
}
printf("%d = ",n);
for(int i = 0;i < b.size();i++){
if(i != 0) printf(" + ");
printf("%d^%d",b[i],p);
}
cout << endl;
return 0;
}