zoukankan      html  css  js  c++  java
  • 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 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<cstdio>
    #include<vector>
    #include<algorithm>
    using namespace std;
    int n,k,p;
    int maxfacsum = -1;
      
      //fac存储的是0^p,1^p……不超过n的数,用来加给facsum和n比较
      //ans是最优底数和(最大),temp是临时底数数组,和最优比较 
    vector<int> fac,ans,temp;
    
    int power(int x){
        int ans = 1;
        for(int i = 0; i < p; i++){
            ans *= x;
        }
        return ans;
    }
    void init(){  //将小于n的p次方数依次存在fac数组中 
        int temp = 0,i = 0;
        while(temp <= n){
             fac.push_back(temp);
             temp = power(++i);
        } 
        
    }
    
    //index表示访问的fac[index]数,nowK表示实际K是数相加
    //facsum 表示当前选择底数之和,sum表示当前选中数之和 
    void DFS(int index,int nowK,int facsum,int sum) {
        if(sum == n && nowK == k){
            if(facsum > maxfacsum ){
                ans = temp;
                maxfacsum = facsum;
            }
            return;
        }
        if(sum > n || nowK > k) return;
        if(index - 1 >= 0){
            temp.push_back(index);
            DFS(index,nowK+1,facsum+index,sum+fac[index]);
            temp.pop_back();
            DFS(index - 1,nowK,facsum,sum);
        }
    }
    
    int main(){
       
        scanf("%d%d%d",&n,&k,&p);
        init();
        DFS(fac.size()-1,0,0,0);
        if(maxfacsum == -1) printf("Impossible
    ");
        else{
            printf("%d = %d^%d",n,ans[0],p);
         for(int i = 1; i < ans.size(); i++){
            printf(" + %d^%d",ans[i],p);
          }
        }
        return 0;
    } 
  • 相关阅读:
    bloom filter
    Crowdsourcing(众包)
    瘦客户端
    如何书写高效的工作邮件:给你十条建议
    JSON
    MATLAB实现频数直方图——hist的使用
    Matlab中给figure添加图例(legend),标题(title)和颜色(color)
    数字信号处理中各种频率关系
    论文的写作要求、流程与写作技巧
    中继器、集线器(HUB)、网桥、交换机、路由器比较
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/8556685.html
Copyright © 2011-2022 走看看