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 = n1^P + ... nK^P
where ni (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 2Sample Output 1:
169 = 6^2 + 6^2 + 6^2 + 6^2 + 5^2Sample Input 2:
169 167 3Sample Output 2:
Impossible
从小的系数开始搜索,每次搜索完毕记录下系数和,如果系数和是当前最大的系数和则更新 ans数组 的值
有一个测试点超时,先mark下,还望大神们看到可以指正。#include<iostream> #include<cmath> #include<cstring> #include<vector> using namespace std; int n,p,k; int tmp[555]; int ans[555]; int maxsum,flag; int sum; int cnt=1; void dfs(int step,int item,int left) { tmp[step]=item; sum+=item; if(step==k) { if(!left) { flag=1; if(sum>=maxsum){ memcpy(ans+1,tmp+1,sizeof(int)*k); maxsum=sum; } } return; } int minn=max(item,1); for(int i=minn;pow(i,p)<=left;i++) { dfs(step+1,i,left-pow(i,p)); } } int main() { //cin>>n>>k>>p; scanf("%d%d%d",&n,&k,&p); dfs(0,0,n); if(flag) { //cout<<n<<" = "<<ans[k]<<"^"<<p; printf("%d = %d^%d",n,ans[k],p); for(int i=k-1;i>=1;i--)printf(" + %d^%d",ans[i],p);putchar(10);//cout<<" + "<<ans[i]<<"^"<<p;cout<<endl; } else printf("Impossible\n");//cout<<"Impossible"<<endl; return 0; }
没有搞出来....先mark一下,大神看到还望更正。