感觉400 400 2这样数据会超时……,但是勉强AC了。
#include <string.h>
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
#include <map>
#include <string>
#include <iostream>
#include <math.h>
using namespace std;
int x,K,e;
bool judge(int x,int step,int factor)
{
if(step==0&&x!=0)
{
return false;
}
else if(step!=0&&x<=0)
{
return false;
}
else if(factor==0)
{
return false;
}
return true;
}
bool cmp(vector<int> a,vector<int> b)
{
for(int i=0;i<a.size();i++)
{
if(a[i]>b[i])return true;
else if(a[i]==b[i])continue;
else if(a[i]<b[i])return false;
}
}
vector<int> result,tempresult;
int maxsum=-1;
void DFS(int nowx,int step,int factor,int factorsum)
{
if(step==0&&nowx==0)
{
if(factorsum>maxsum)
{
result=tempresult;
maxsum=factorsum;
}
else if(factorsum==maxsum)
{
if(cmp(tempresult,result))
{
result=tempresult;
}
}
return;
}
else if(!judge(nowx,step,factor))
{
return;
}
int y=1;
for(int i=0;i<e;i++)
{
y*=factor;
}
tempresult.push_back(factor);
DFS(nowx-y,step-1,factor,factorsum+factor);
tempresult.pop_back();
DFS(nowx,step,factor-1,factorsum);
}
int main()
{
scanf("%d%d%d",&x,&K,&e);
int factor=pow(x*1.0,1/(e*1.0))+1;
DFS(x,K,factor,0);
if(result.size()==0)
{
printf("Impossible\n");
}
else
{
printf("%d =",x);
for(int i=0;i<result.size();i++)
{
if(i!=0)printf(" +");
printf(" %d^%d",result[i],e);
}
printf("\n");
}
return 0;
}