1103 Integer Factorization (30 分)
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 { 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
这道题就是dfs加剪枝,思路还是比较明确的;
#include<cmath>
#include <iostream>
#include<vector>
using namespace std;
int n, k,p,now=0,sum=0;//nkp如题,now存放当前满足条件的解的最大和,sum是当前解的和
bool flag=false;//判断是否存在解
int a[410];
vector<int> ans;//临时存放解数组
vector<int> fans;//满足条件的数组,最后结果保存在这个数组当中
void print() {//打印最后结果
cout << n << " =";
for (int i = 0; i < k; i++) {
printf("%s%d^%d", i == 0 ? " " : " + ", fans[i], p);
}cout << endl;
}
void dfs(int temp,int num,int k) {
for (int i = temp; i > 0; i--) {
if (a[i] == num && k == 1) {
flag = true;
ans.push_back(i);
sum += i;
if (now < sum) {
now = sum;
fans = ans;
//print();
}
ans.pop_back();
sum -= i;
continue;
}
if (a[i] * k < num)return;
else if (a[i] <= num) {
ans.push_back(i);
sum += i;
dfs(i, num-a[i], k - 1);
ans.pop_back();
sum -= i;
}
}
}
int main()
{
cin >> n >> k >> p;
/* //t这个值需要动态生成,用后面写的while去做
//如果直接给定t的值或者开方去求的话,有一个测试点过不了
//但是那个测试点可以通过固定t的值等于8或者9,这样那个测试点就可以通过
//这个地方到底是因为什么原因,目前还没有搞清楚
int t = 13;
for (int i = 0; i <= t; i++) {
a[i]=pow(1.0*i, p);
}*/
int t = 0, temp = 0;
while (temp <= n ) {
a[t++] = pow(1.0*t, p);
}
dfs(t-1,n,k);
if (!flag) {
cout << "Impossible" << endl;
return 0;
}
print();
return 0;
}