The K−PK-PK−P factorization of a positive integer NNN is to write NNN as the sum of the PPP-th power of KKK positive integers. You are supposed to write a program to find the K−PK-PK−P factorization of NNN for any positive integers NNN, KKK and PPP.
Input Specification:
Each input file contains one test case which gives in a line the three positive integers NNN (≤400\le 400≤400), KKK (≤N\le N≤N) and PPP (1<P≤71 < P\le 71<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 thei
-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+1212^2 + 4^2 + 2^2 + 2^2 + 1^2122+42+22+22+12, or 112+62+22+22+2211^2 + 6^2 + 2^2 + 2^2 + 2^2112+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,⋯,aKa_1, a_2, \cdots , a_Ka1,a2,⋯,aK } is said to be larger than { b1,b2,⋯,bKb_1, b_2, \cdots , b_Kb1,b2,⋯,bK } if there exists 1≤L≤K1\le L\le K1≤L≤K such that ai=bia_i=b_iai=bi for i<Li<Li<L and aL>bLa_L>b_LaL>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 = n[1]^P + ... n[K]^P, n[i]为N的因子,可重复
注意:最大只若两个组合均符合条件,取因子之和较大的,若因子之和相同,各自因子从前往后比,首先较大者取之
思路:递归,参数有四(当前尝试因子,当前已计入的因子个数,当前sumN,当前因子之和)
- 下一步dfs(x)之前剪枝
- 还是要“循规蹈矩”
- 判断“最大”易错
- dfs(x-1),而非for()……
- memcpy(ans,cur,K*sizeof(int));
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int INF=0x3f3f3f3f;
int N,P,K;
int cur[405];
int ans[405];
int p[405];
int flag=0,fsum,maxfsum=-INF;
void init() {
for(int i=1; i<405; i++)
p[i]=pow(i,P);
}
bool judge() {
for(int i=0; i<K; i++) {
if(cur[i]>ans[i]) return true;
else if(cur[i]<ans[i])return false;
}
return false;
}
void dfs(int x,int nowk,int nowsum,int fsum) {
if(nowk==K&&nowsum==N) {
if(!flag) flag=1;
if((fsum>maxfsum)||((fsum==maxfsum)&&judge())) {
memcpy(ans,cur,K*sizeof(int));
maxfsum=fsum;
}
return;
}
if(nowk>=K||nowsum>=N) return;
if(x>=1) {
cur[nowk]=x;
if(nowsum+p[x]<=N)
dfs(x,nowk+1,nowsum+p[x],fsum+x);
cur[nowk]=0;//
dfs(x-1,nowk,nowsum,fsum);
}
}
int main() {
cin>>N>>K>>P;
init(); //建求和表
memset(cur,0,sizeof cur);
dfs(sqrt(N),0,0,0);
if(flag==0) cout<<"Impossible\n";
else {
printf("%d = ",N);
for(int i=0; i<K-1; i++)
printf("%d^%d + ",ans[i],P);
printf("%d^%d\n",ans[K-1],P);
}
return 0;
}