原题链接:A1103 Integer Factorization
#include<algorithm>
#include<iostream>
#include<cstdio>
#include <vector>
using namespace std;
vector<int> S, Best, Exp;
int N, K, P, max_base_sum = 0;
int pow(int x)
{
int e = P, result = 1;
while(e--) result *= x;
return result;
}
void DFS(int index, int num, int sum, int base_sum)
{
if(sum == N && num == K)//满足条件
{
if(base_sum > max_base_sum)//若更优,则更新
{
Best = S;
max_base_sum = base_sum;
}
return ;
}
if(!index || num >= K || sum >= N) return ;//再继续则必不满足条件,直接返回
S.push_back(index);
DFS(index, num+1, sum+Exp[index], base_sum+index);//由于底数可重复,故此时index不能减一
S.pop_back();
DFS(index-1, num, sum, base_sum);//用其下一个试试水
}
int main()
{
scanf("%d %d %d", &N, &K, &P);
for(int i=0, temp = 0; temp < N; i++)//让Exp存储N以内整数的P次幂,避免之后的重复计算
{//我刚开始写的条件是 i <= N, 这么做会超时
temp = pow(i);
Exp.push_back(temp);
}
DFS(Exp.size()-1, 0, 0, 0);
if(!max_base_sum) printf("Impossible");//打印
else
{
printf("%d = %d^%d", N, Best[0], P);//注意控制输出格式
for(int i=1; i<K; i++)
{
printf(" + %d^%d", Best[i], P);
}
}
return 0;
}