1103. Integer Factorization (30)

来源:互联网 发布:linux 查看文件夹数量 编辑:程序博客网 时间:2024/05/29 18:14

    DFS加剪枝

#include <iostream>#include <cstdio>#include <vector>#include <cmath>#include <algorithm>using namespace std;int n, k, p;vector<vector<int>> results;int maxSum = 0;int power(int num, int exp){if(exp == 0) return 1;int val = power(num, exp/2);if(exp%2) return val*val*num;else return val*val;}void dfs(int gap, int cnt, vector<int>& path){if(cnt == k){if(gap == 0){results.push_back(path);}return;}int low = cnt > 0 ? path[cnt-1] : 1;int high = sqrt(double(gap));for(int i = low; i <= high; ++i){int tmp = power(i, p);if(tmp > gap) return ;path.push_back(i);dfs(gap - tmp, cnt+1, path);path.pop_back();}}bool cmp(const vector<int>& a, const vector<int>& b){int sum1 = 0, sum2 = 0;for(size_t i = 0; i < a.size(); ++i)sum1 += a[i];for(size_t i = 0; i < b.size(); ++i)sum2 += b[i];if(sum1 != sum2) return sum1 > sum2;else{for(size_t i = 0; i < a.size() && i < b.size(); ++i){if(a[i] != b[i]) return a[i] > b[i];}return false;}}int main(){scanf("%d%d%d", &n, &k, &p);vector<int> path;dfs(n, 0, path);if(results.empty()){printf("Impossible");}else{sort(begin(results), end(results), cmp);auto result = results[0];sort(begin(result), end(result), greater<int>());printf("%d = ", n);for(size_t i = 0; i < result.size(); ++i){if(i) printf(" + ");printf("%d^%d", result[i], p);}}return 0;}


0 0
原创粉丝点击