#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
//DFS,注意生成分支:是否选择index

int n,k,p,maxFacSum=-1;//n=k个(数i^p)
vector<int> v,ans,tempAns;
//ans数组存储因子的序列,tempAns为当前DFS来的序列,init把i从0开始所有的i的p次方的值存储在v[i]中
void init(){
int temp=0,index=1;
while(temp <=n){
v.push_back(temp);
temp=pow(index,p);
index++;
}
}
/*
index为当前正相加的v[i]的i
tempSum当前的总和
tempK当前K的总个数
facSum为当前因子和
*/
void dfs(int index,int tempSum,int tempK,int facSum){
if(tempK==k&&tempSum==n){ //有结果
if(facSum >maxFacSum){ //剪枝1
ans=tempAns;
maxFacSum=facSum;//更新当前的因子和
}
return;
}
if(tempK>k || tempSum>n) return;//无结果
if(index >= 1){ //生成分支
tempAns.push_back(index);//选择index
dfs(index,tempSum+v[index],tempK+1,facSum+index);
tempAns.pop_back();
dfs(index-1,tempSum,tempK,facSum);//不选择index
}
}

/*剪枝:
1. tempK==K但是tempSum!=n的时候需要剪枝
2. 在枚举的时候,按顺序枚举,上界或者下界可进行剪枝
*/
int main(){
scanf("%d%d%d",&n,&k,&p);
init();
dfs(v.size()-1 ,0,0,0);
//从v[i]末尾往前遍历,保证ans和tempAns数组保存的是从大到小的因子的顺序
if(maxFacSum == -1) {
printf("Impossible");
return 0;
}//开始maxFacSum == -1,如果dfs后maxFacSum仍为-1,则输出Impossible,否则输出答案
printf("%d = ",n);
for(int i=0;i<ans.size();i++) {
if( i != 0) printf(" + ");//细节
printf("%d^%d",ans[i],p);
}
system("pause");
return 0;
}