PAT甲級 1103 Integer Factorization (DFS)

嗚嗚,寫題的時候好睏吶…。結果不是很難的題目硬是搞了這麼久!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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章