Dfs+prune
AC Code:
#include <vector>#include<cstdio>#include<algorithm>#include<cmath>#include<numeric>using namespacestd;classsol{ Public: Vector<int>seq; intsum;};BOOL operator< (Constsol& A,Constsol&b) { if(A.sum! =b.sum)returnA.sum >b.sum; Else{ for(inti =0; i < a.seq.size (); i++){ if(A.seq[i] <B.seq[i])return false; Else if(A.seq[i] >B.seq[i])return true; } }}voidRec (vector<int>& pvec,vector<sol>& Ret,sol seq,intNintKintPintID) { if(N < k | | k = =0&& n! =0|| n > K *Pvec[id])return; Else if(n = =0&& k = =0) {seq.sum= Accumulate (Seq.seq.begin (), Seq.seq.end (),0); Ret.push_back (seq); } Else{ intRoot (Pvec.size ()-1); for(inti = Id;i >=1; i--){ inttmp (Pvec[i]); if(n >= tmp + K-1) {seq.seq.push_back (i); Rec (Pvec,ret,seq,n-tmp,k-1, P,i); Seq.seq.pop_back (); } } }}intMain () {intn,k,p; scanf (" %d%d%d",&n,&k,&p); Vector<sol>ret; Sol seq; Vector<int>Pvec; intNum0); while(true){ intTMP (POW (float(num), p)); if(TMP <=N) {pvec.push_back (TMP); } Else{ Break; } num++; } intID (pvec.size ()-1); Rec (PVEC,RET,SEQ,N,K,P,ID); if(ret.size () = =0) printf ("impossible\n"); Else{sort (Ret.begin (), Ret.end ()); printf ("%d =", N); for(inti =0; I < k;i++){ if(i = =0) {printf ("%d^%d", ret[0].seq[0],p); } Else{printf ("+%d^%d", ret[0].seq[i],p); }} printf ("\ n"); } return 0;}
1103 integer Factorization