#include<iostream>
#include<vector>
using namespace std;
int n, k, p, maxSum = -1;
vector<int> fac, ans, temp;
int power(int x) {
int ans = 1;
for(int i = 0; i < p; i++) {
ans *= x;
}
return ans;
}
void init() {
int temp = 0, i = 0;
while(temp <= n) {
fac.push_back(temp);
temp = power(++i);
}
}
void DFS(int index, int nowK, int sum, int facSum) {
if(sum == n && nowK == k) {
if(facSum > maxSum) {
ans = temp;
maxSum = facSum;
}
return ;
}
if(sum > n || nowK > k) return ;
if(index - 1 >= 0) {
temp.push_back(index);
DFS(index, nowK + 1, sum + fac[index], facSum + index);
temp.pop_back();
DFS(index - 1, nowK, sum, facSum);
// 写成这样会报错
// DFS(index - 1, nowK, sum, facSum);
// temp.push_back(index);
// DFS(index, nowK + 1, sum + fac[index], facSum + index);
// temp.pop_back();
// 即不能先考虑 “未选” 的情况
}
}
int main() {
cin >> n >> k >> p;
init();
DFS(fac.size() - 1, 0, 0, 0);
if(maxSum == -1) printf("Impossible\n");
else {
printf("%d = %d^%d", n, ans[0], p);
for(int i = 1; i < ans.size(); i++) {
printf(" + %d^%d", ans[i], p);
}
}
return 0;
}
PAT A1103(测试点2答案错误)
于 2021-01-30 20:58:54 首次发布