#include <bits/stdc++.h>
using namespace std;
//FILE *p = fopen("file.txt", "w");
int N, K, P, maxsum = 0, mintop = 20;
stack<int> maxs, s;
stack<int> tmps ,tmpmaxs;
int up;
void dfs(int cnt, int n, int sum, int ans)
{
if (n != 0)
s.push(n);
if (ans > N || n > up || cnt > K || (cnt == K && ans == N && sum < maxsum))
{
s.pop();
return;
}
else if (cnt == K && ans == N && sum >= maxsum)
{
if (s.top() < mintop)
mintop = s.top();
//fprintf(p, "%d %d %d %d\n", cnt, n, sum, ans);
//printf("%d>=%d\n",sum,maxsum);
if (sum > maxsum||maxs.empty())
maxs = s;
else if(sum == maxsum )
{
tmps = s;
tmpmaxs = maxs;
while (tmps.size() > 0)
{
//printf("%d>=%d\n",sum,maxsum);
if(tmps.top() == tmpmaxs.top())
{
//printf("%d==%d\n",tmps.top(),tmpmaxs.top());
tmps.pop();
tmpmaxs.pop();
}
else if (tmps.top() < tmpmaxs.top()){
break;
}
else if (tmps.top() > tmpmaxs.top())
{
maxs = s;
break;
}
}
}
maxsum = sum;
s.pop();
return;
}
//fprintf(p, "%d %d %d %d\n", cnt, n, sum, ans);
if (n == 0)
for (int i = 1; i <= up; i++)
{
if (n + i <= mintop)
dfs(cnt + 1, n + i, sum + n + i, ans + pow(n + i, P));
else
break;
}
else
for (int i = 0; i <= up - n; i++)
{
if (n + i <= mintop)
dfs(cnt + 1, n + i, sum + n + i, ans + pow(n + i, P));
else
break;
}
if (n != 0)
s.pop();
return;
}
int main()
{
scanf("%d%d%d", &N, &K, &P);
up = floor(pow(1.0 * N - K + 1, 1.0 / P));
dfs(0, 0, 0, 0);
if (maxsum == 0)
printf("Impossible\n");
else
{
printf("%d = ", N);
while (maxs.size() > 1)
{
printf("%d^%d + ", maxs.top(), P);
maxs.pop();
}
if (maxs.size() == 1)
printf("%d^%d\n", maxs.top(), P);
}
return 0;
}
测试点2过不了