PAT 1103 Integer Factorization

The K-P factorization of a positive integer N is to write N as the sum of the P-th power of K positive integers. You are supposed to write a program to find the K-P factorization of N for any positive integers N, K and P.

Input Specification:

Each input file contains one test case which gives in a line the three positive integers N (<=400), K (<=N) and P (1<P<=7). The numbers in a line are separated by a space.

Output Specification:

For each case, if the solution exists, output in the format:

N = n1^P + ... nK^P

where ni (i=1, ... K) is the i-th factor. All the factors must be printed in non-increasing order.

Note: the solution may not be unique. For example, the 5-2 factorization of 169 has 9 solutions, such as 122 + 42 + 22 + 22 + 12, or 112 + 62 + 22 + 22 + 22, or more. You must output the one with the maximum sum of the factors. If there is a tie, the largest factor sequence must be chosen -- sequence { a1, a2, ... aK } is said to be larger than { b1, b2, ... bK } if there exists 1<=L<=K such that ai=bi for i<L and aL>bL

If there is no solution, simple output "Impossible".

Sample Input 1:

169 5 2

Sample Output 1:

169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2

Sample Input 2:

169 167 3

Sample Output 2:

Impossible

分析
这道题用深度优先搜索方法来实现。

#include<iostream> //深度优先搜索
#include<vector>
#include<math.h>
using namespace std;
int N, P, K, maxsum=-1;
vector<int> v, ans, tempans;
void init(){
  int temp=0, index=1;
  while(temp<=N){
    v.push_back(temp);
    temp=pow(index, P);
    index++;
  }
}
void dfs(int index, int tempsum, int tempk, int facsum){
  if(tempsum==N&&tempk==K){
    if(facsum>maxsum){
      ans=tempans;
      maxsum=facsum;
    }
    return ;
  }
  if(tempsum>N||tempk>K) return ;
  for(int i=index; i>=1; i--){
    tempans.push_back(i);
    dfs(i, tempsum+v[i], tempk+1, facsum+i);
    tempans.pop_back();
  }
}
int main(){
  cin>>N>>K>>P;
  init();
  dfs(v.size()-1, 0, 0, 0);
  if(maxsum==-1){
    cout<<"Impossible"<<endl;
    return 0;
  }
  cout<<N<<" = "<<ans[0]<<"^"<<P;
  for(int i=1; i<ans.size(); i++)
    cout<<" + "<<ans[i]<<"^"<<P;
  return 0;
}
posted @ 2018-08-19 17:21  A-Little-Nut  阅读(269)  评论(0编辑  收藏  举报