Recursion helps a lot.
#include <iostream>
#include <stdio.h>
#include<stdlib.h>
#include <math.h>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <queue>
#include <set>
using namespace std;
const int MAXN = 450;
int N, K, P;
int F[MAXN];
int ans[MAXN];
int maxsum = 0;
void solve(int n, int k, int p)
{
if (k == 0) {
if (n == 0) {
int sum = 0;
for (int i = 0; i < K; i++) sum += F[i];
if (sum > maxsum) {
maxsum = sum;
for (int i = 0; i < K; i++) ans[i] = F[i];
}
}
return;
}
if (n - k + 1 < 1) return;
for (int f = (int)sqrt(n - k + 1); f >=1; f--)
{
if ((int)pow(f,p) > n - k + 1) continue;
if (k<K&&f>F[K - k - 1]) continue; //保证是noincreasing排列
if ((int)pow(f, p) < n /k) break;
F[K - k] = f;
solve(n - int(pow(f, p)), k - 1, p);
}
}
int main() {
cin >> N >> K >> P;
solve(N, K, P);
if (maxsum == 0) cout << "Impossible" << endl;
else {
cout << N << " =";
for (int i = 0; i < K; i++) {
if(i==0)cout <<' '<< ans[i] << '^'<<P;
else cout<<" + " << ans[i] << '^' << P;
}
cout << endl;
}
//cout << endl;
return 0;
}