1103 Integer Factorization(DFS)

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
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;
}
发布了110 篇原创文章 · 获赞 0 · 访问量 1251

猜你喜欢

转载自blog.csdn.net/qq_43072010/article/details/105553787