数据比较水,爆搜都能过
#include <bits/stdc++.h>
using namespace std;
int n, p, k;
int t;
const int N = 405;
int table[N];
vector<int> tt, res;
int ma = -1;
void dfs(int cur, int ans, int m) {
// cout << "!"<<endl;
if (cur == p + 1) {
if (ans == n) {
// pass and check
int temp = 0;
for (int v : tt) {
temp += v;
}
if (ma < temp) {
ma = temp;
res = tt;
}
} else
return;
}
if (ans > n)
return;
for (int i = m; i > 0; i--) {
if ((p - cur + 1) * table[i] < n - ans)
break;
tt.push_back(i);
dfs(cur + 1, ans + table[i], i);
tt.pop_back();
}
}
int main() {
cin >> n >> p >> k;
for (int i = 1; i <= n+1; i++) {
table[i] = (int)pow(i, k);
if (table[i] > n) {
t = i - 1;
break;
}
}
dfs(1, 0, t);
if (ma == -1)
puts("Impossible");
else {
printf("%d = ", n);
for (int i = 0; i < res.size(); i++) {
printf("%d^%d%s", res[i], k, i < res.size() - 1 ? " + " : "\n");
}
}
return 0;
}