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.
Each input file contains one test case which gives in a line the three positive integers N (≤400), K (≤N) and P (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+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
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,num,maxfcsum=-1,ans[409],a[409],b[409],flag;
void dfs( int index,int cnt ,int sum ,int fcsum){
if( sum > n )
return;
if( cnt == k + 1 ){
if( sum == n ){
if( fcsum > maxfcsum ){
memset(ans,0,sizeof(ans));
for( int i=1;i=1;i--){
b[cnt] = i;
dfs(i,cnt+1,sum+a[i],fcsum+i);
}
}
int main(void){
int p;
scanf("%d%d%d",&n,&k,&p);
for( int i=0;i<=n;i++){
if( pow(i,p) <=n ){
a[i] = pow(i,p);
num=i;
}
else break;
}
dfs(num,1,0,0);
if( !flag ){
printf("Impossible\n");
}
else {
flag = 0;
printf("%d = ", n);
for( int i=0;i