#include<stdio.h>
#include<vector>
using namespace std;
vector<int> fac,ans,temp;
int N,k,p,maxfacsum=0;
void dfs(int index,int nowk,int sum,int facsum){
if(nowk==k&&sum==N){
if(facsum>maxfacsum){
maxfacsum=facsum;
ans=temp;
}
return;
}
if(index>=1&&nowk<k&&sum<N){
temp.push_back(index);
dfs(index,nowk+1,sum+fac[index],facsum+index);
temp.pop_back();
dfs(index-1,nowk,sum,facsum);
}
}
int power(int x){
int ans=1;
for(int i=0;i<p;i++){
ans=ans*x;
}
return ans;
}
void init(){
int t=0,i=0;
while(t<=N){
fac.push_back(t);
t=power(++i);
}
}
int main(){
scanf("%d%d%d",&N,&k,&p);
init();
dfs(fac.size()-1,0,0,0);
if(maxfacsum==0) printf("Impossible\n");
else {
printf("%d = ",N);
for(int i=0;i<k;i++){
int t=ans[i];
printf("%d^%d",t,p);
if(i!=k-1)printf(" + ");
}
}
return 0;
}
第一次,参考算法笔记完成,50min
要点,用fac存index^p;