#include <bits/stdc++.h>
using namespace std;
int n,k,p;
int r;
void init(){
for(int i = 1;i <= 20;i++){
int temp = 1;
for(int j = 0;j < p;j++){
temp *= i;
}
if(temp >= n){
r = i;
return;
}
}
}
int fun(int x){
int temp = 1;
for(int i = 0;i < p;i++){
temp *= x;
}
return temp;
}
int ans1 = -1;
int ans2[1005];
void dfs(int sum,int cnt,int path[],int now){
if(sum + (k - cnt) * now > n) return;
if(sum == n && cnt == k){
if(ans1 == -1){
for(int i = 0;i < cnt;i++){
ans2[i] = path[i];
ans1 = 0;
}
}
else{
bool flag;
int sum1 = 0;
int sum2 = 0;
for(int i = 0;i < cnt;i++){
sum1 += path[i];
sum2 += ans2[i];
}
//cout << sum1 << " " << sum2 << endl;
if(sum1 == sum2){
for(int i = 0;i < cnt;i++){
if(path[i] < ans2[i]){
flag = false;
}
else if(path[i] > ans2[i]){
flag = true;
}
}
}
else if(sum1 > sum2){
flag = true;
}
else{
flag = false;
}
if(flag){
for(int i = 0;i < cnt;i++){
ans2[i] = path[i];
}
}
}
}
for(int i = r;i >= now;i--){
int temp = fun(i);
if(temp + sum <= n && cnt + 1 <= k){
path[cnt] = i;
dfs(temp+sum,cnt+1,path,i);
}
}
}
int main()
{
cin >> n >> k >> p;
init();
int path[1005];
dfs(0,0,path,1);
if(ans1 == -1){
cout << "Impossible" << endl;
return 0;
}
cout << n << " = ";
for(int i = k-1;i >= 0;i--){
cout << ans2[i] << "^" << p;
if(i != 0) cout << " + ";
}
}
pat1103
最新推荐文章于 2022-12-06 08:00:00 发布