#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <stack>
using namespace std;
int N,K,P;
vector<int> v,ans;
int maxx=-1;
int po[400]={0};//直接打表,免得每次用到都得pow(),另外,pow()算int有误差!!最好自己写一个
int power(int d,int p)
{
if(p==0)
return 1;
int ans=1;
for(int i=0;i<p;i++)
{
ans*=d;
}
return ans;
}
int m=1;
void init()
{
while(power(m,P)<=N)
{
po[m]=power(m,P);
m++;//最后会多一个
}
}
void dfs(int cou,int sum,int disum)
{
if(sum>N)//剪枝2
return;
if(cou==K)
{
if(sum==N&&disum>=maxx)
{
ans=v;
maxx=disum;
}
return;
}
int lower=(cou==0?1:v[cou-1]);//剪枝1:为避免重复,保持递增
for(int i=lower;i<=m;i++)
{
v.push_back(i);
if(sum+po[i]>N)
{
v.pop_back();
break;
}
dfs(cou+1,sum+po[i],disum+i);
v.pop_back();
}
return;
}
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
freopen("in.txt","r",stdin);
scanf("%d %d %d",&N,&K,&P);
init();
m--;//减去上面m++误加的一个
dfs(0,0,0);
sort(ans.begin(),ans.end(),cmp);
if(maxx==-1)
{
printf("Impossible");
return 0;
}
printf("%d = ",N);
for(int i=0;i<ans.size();i++)
{
printf("%d^%d",ans[i],P);
if(i!=ans.size()-1)
{
printf(" + ");
}
}
return 0;
}
1103. Integer Factorization (30)--dfs
最新推荐文章于 2020-07-28 19:41:56 发布