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
Sample Output 1:
169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2
Sample Input 2:
169 167 3
Sample Output 2:
Impossible
题意:给定正整数N,K,P,将N表示成K个正整数(可以相同,递减排列)的P次方的和,即N=n1^p+...+nk^p。如果有多种方案,那么选择底数和n1+...+nk最大的方案:如果还有多种方案,那么选择底数序列的字典序最大的方案。
1 #include<cstdio> 2 #include<vector> 3 #include<algorithm> 4 using namespace std; 5 int n,k,p,maxFacSum = -1; //n,k,p如题所诉,maxFacSum记录最大底数之和 6 vector<int> fac,ans,temp; //fac记录0^p,1^p...i^p,ans存放最优底数序列,temp存放递归中的临时底数序列 7 8 int power(int x) { //power函数计算x^p 9 int ans = 1; 10 for(int i=0; i<p; i++){ 11 ans *= x; 12 } 13 return ans; 14 } 15 16 void init() { 17 int i=0, temp=0; 18 while(temp <= n) { //当i^p没有超过n时,不断把i^p加入fac 19 fac.push_back(temp); 20 temp = power(++i); 21 } 22 } 23 24 //DFS函数,当前访问fac[index],nowK为当前选中个数 25 //sum为当前选中的数之和,facSum为当前选中的底数之和 26 void DFS(int index, int nowK, int sum, int facSum) { 27 if(sum == n && nowK == k) { //找到一个满足的序列 28 if(facSum > maxFacSum) { //底数之和更优 29 ans = temp; //更新最优底数序列 30 maxFacSum = facSum; //更新最大底数之和 31 } 32 return; 33 } 34 if(sum > n || nowK > k) return; //这种情况下不会产生答案,直接返回 35 if(index - 1 >= 0) { //fac[0]不需要选择 36 temp.push_back(index); //把底数index加入临时序列temp 37 DFS(index, nowK+1, sum+fac[index], facSum+index); //"选"的分支 38 temp.pop_back(); //"选"的分支结束后把刚加进去的数pop掉 39 DFS(index-1, nowK, sum, facSum); //"不选"的分支 40 } 41 } 42 43 int main() { 44 scanf("%d%d%d",&n,&k,&p); 45 init(); //初始化fac数组 46 DFS(fac.size()-1,0,0,0); //从fac的最后一位开始往前搜索 47 if(maxFacSum == -1) printf("Impossible "); 48 else { 49 printf("%d = %d^%d",n,ans[0],p); //输出ans的结果 50 for(int i=1 ; i<ans.size(); i++) { 51 printf(" + %d^%d", ans[i],p); 52 } 53 } 54 return 0; 55 }