PAT 甲级 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+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=b​i 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
#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int> > res;
int power(int a,int b)
{
    int sum=1;
    for(int i=0;i<b;i++)
        sum*=a;
    return sum;
}
int N,K,P;
void dfs(int curr,int up,int level,vector<int> &t)
{
    if(curr<0||level<0)
        return;
    if(level==0&&curr==0)
    {
        res.push_back(t);
        return;
    }
    if(curr==0||level==0)
        return;
    for(int i=up;i>=1;i--)
    {
        t.push_back(i);
        dfs(curr-power(i,P),i,level-1,t);
        t.pop_back();
    }
}
bool cmp(vector<int> a,vector<int> b)
{
    int sum1=0,sum2=0;
    for(int i=0;i<a.size();i++)
    {
        sum1+=a[i];
        sum2+=b[i];
    }
    if(sum1!=sum2)
        return sum1>sum2;
    else
        return a>b;
}
int main(){
    cin>>N>>K>>P;
    vector<int> t;
    int a=sqrt(N-K+1); //最大值
    dfs(N,a,K,t);
    if(res.empty())
        printf("Impossible\n");
    else{
        sort(res.begin(),res.end(),cmp);
        printf("%d =",N);
        int i=0;
        for(i=0;i<res[0].size()-1;i++)
            printf(" %d^%d +",res[0][i],P);
        printf(" %d^%d\n",res[0][i],P);
    }
    return 0;
}
发布了174 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_41173604/article/details/100215482
今日推荐