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 = n~1~^P + ... n~K~^P

where n~i~ (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 12^2^ + 4^2^ + 2^2^ + 2^2^ + 1^2^, or 11^2^ + 6^2^ + 2^2^ + 2^2^ + 2^2^, 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 { a~1~, a~2~, ... a~K~ } is said to be larger than { b~1~, b~2~, ... b~K~ } if there exists 1<=L<=K such that a~i~=b~i~ for i<L and a~L~>b~L~

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;
}

猜你喜欢

转载自www.cnblogs.com/A-Little-Nut/p/9501855.html
今日推荐