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 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
1
Sample Output 1:
169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2
1
Sample Input 2:
169 167 3
1
Sample Output 2:
Impossible
题目大意
给定整数N,求K个因子,使它们的P次方之和等于N,若有多个解,则输出因子之和最大的,若仍有多个解,则输出较大的序列。
思路
用DFS的方法,设定四个参数,index表示当前访问因子,sum表示因子平方和,cnt表示当前选中因子数,facsum表示因子和。两个vector,temp表示临时路径,ans表示最终路径。依题意,因子平方和等于n、因子数等于k时得到一条完整路径,若当前因子和大于最大因子和max_fac,则更新路径,否则不更新。而平方和大于n、因子和大于k时没有路径,直接退出。进入递归时有两种情况:一是选当前因子index,则将其加入temp,再继续对index进行递归(因为一个index可选多次);二是不选择index,则将其清除,对下一个因子index-1进行递归。
注意这里由于index是逆序(为了得到较大的序列),要进入递归,必须满足index-1>=0的条件。
AC代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
vector<int> temp, ans, fac;
int n, k, p, max_fac = -1;
void DFS(int index, int sum, int cnt, int facsum){
if(cnt == k && sum == n){
if(facsum > max_fac){
max_fac = facsum;
ans = temp;
}
return;
}
if(cnt > k || sum > n) return;
if(index > 0){
temp.push_back(index); //选index
DFS(index, sum + fac[index], cnt + 1, facsum + index);
temp.pop_back(); //不选
DFS(index - 1, sum, cnt, facsum);
}
}
int main(){
cin>>n>>k>>p;
for(int i = 0; pow(i, p) <= n; ++i)
fac.push_back(pow(i, p));
DFS(fac.size() - 1, 0, 0, 0);
if(max_fac == -1) cout<<"Impossible";
else{
cout<<n<<" = ";
for(int i = 0; i < ans.size(); ++i){
if(i != 0) cout<<" + ";
cout<<ans[i]<<"^"<<p;
}
}
return 0;
}