嗚嗚,寫題的時候好睏吶…。結果不是很難的題目硬是搞了這麼久!qwq哎。睡醒後看了1小時p站DJ…流淚。國慶放假啥都沒幹,唯一堅持的事情就是瘋狂熬夜。天天睡得超級晚…劉海那一塊兒要禿啦…(哭)
注意
1.int型冪函數自己寫一個,不要用double類型的pow()函數,存在誤差導致結果錯誤
2.爲了保證輸出滿足條件的所有情況中字典序最大的。我們選擇從大往小的遍歷
3.每個數可重複選擇,則可以把所有可能因素的p次方求出來存在vector數組fac裏,減少計算量。方便起見從fac[0] = 0,fac[1] = 1^p…這樣便於統一sumfac和sum的計算
#include <iostream>
#include<cstdio>
#include<map>
#include<queue>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn = 100000 + 5;
int n, k, p, facsumT = 0;
vector<int>fac, temp, ans;
int power(int x, int p){
int t = 1;
for(int i = 0; i < p; i++)
t *= x;
return t;
}
//分叉口:上一個Index要或者不要~
void DFS(int index, int nowCnt, int sum, int facsum){
if(nowCnt == k && sum == n && facsum > facsumT){
ans = temp;
facsumT = facsum;
return;
}
if(index == 0 || nowCnt == k || sum > n){
return;
}
//還是這個index
temp.push_back(index);
DFS(index, nowCnt + 1, sum + fac[index], facsum + index);
//不要這個index了,改爲決定上一個index要不要
temp.pop_back();
DFS(index-1, nowCnt, sum, facsum);
}
int main(){
scanf("%d%d%d", &n, &k, &p);
//預處理可能的fac的p次方
for(int i = 0, x = 0; x <= n; i++){
fac.push_back(x);
x = power(i+1, p);
}
//爲了得到滿足條件的字典序最大的序列,決定從小到大遍歷嗷。
DFS(fac.size()-1, 0, 0, 0);
int len = ans.size();
if(len == 0)
printf("Impossible");
else{
printf("%d = ",n);
for(int i = 0; i < ans.size(); i++){
if(i)
printf(" + ");
printf("%d^%d",ans[i], p);
}
}
return 0;
}