• PAT A1103—DFS


     Integer Factorization

    The KP 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 KP 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<P7). 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 { b​1​​,b​2​​,⋯,b​K​​ } if there exists 1≤L≤K such that a​i​​=b​i​​ for i<L and a​L​​>b​L​​.

    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 }
  • 相关阅读:
    ubuntu14.04 允许root用ssh登录
    MySQL(Navicat)运行.sql文件时报错:[Err] 2006
    Ubuntu14.04 安装git
    Ubuntu14.04下安装redis
    ubuntu apt-get update 失败解决
    检出商品详情中的图片并替换url
    nohup和&后台运行,进程查看及终止
    ubuntu 的chmod 和 chown
    php5.4安装fileinfo扩展
    crontab
  • 原文地址:https://www.cnblogs.com/mxj961116/p/10431425.html
Copyright © 2020-2023  润新知