博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1103 Integer Factorization (30分) dfs 基础题
阅读量:3904 次
发布时间:2019-05-23

本文共 2242 字,大约阅读时间需要 7 分钟。

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​​+4​2​​+2​2​​+2​2​​+1​2​​, or 11​2​​+6​2​​+2​2​​+2​2​​+2​2​​, 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 { a​1​​,a​2​​,⋯,a​K​​ } 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

 

#include
#include
#include
#include
#include
using namespace std;vector
ans,temp,fac;int n,k,p,max_fac_sum=-1;void init(int k,int p){ int i=1; ans.clear(); temp.clear(); fac.clear(); for(i=0;i<=20;i++){ fac.push_back(pow(i,p)); }}int dfs(int index,int cur_k,int sum,int fac_sum){ if(cur_k==k&&sum==n){ if(fac_sum>max_fac_sum) { ans=temp; max_fac_sum=fac_sum;// for(int i=1;i
n||cur_k>k) return 0; if(index>0){ temp.push_back(index); dfs(index,cur_k+1,sum+fac[index],fac_sum+index); temp.pop_back(); dfs(index-1,cur_k,sum,fac_sum); } return 0;}int main(){ scanf("%d %d %d",&n,&k,&p); init(k,p); dfs(fac.size()-1,0,0,0); if(max_fac_sum==-1){ printf("Impossible\n"); } else{ for(int i=0;i

题意:

给三个数,npk,把n因式分解,分解成p个数的k次方之和。

要求:

     这p个数之和最大,如果存在多种情况,则输出字典序最大的那个。(可以重复选)

难点解析:

字典序:从大到小选择。

求最大和:

if(cur_k==k&&sum==n){     	if(fac_sum>max_fac_sum)     	{     		ans=temp;     		max_fac_sum=fac_sum;

寒假第一天

转载地址:http://muven.baihongyu.com/

你可能感兴趣的文章
linux内核源码的下载 ------ 各种版本的 v1.x v2.x v3.x
查看>>
ubutun12.0.4编译低版本的内核linux-3.1.4 的步骤
查看>>
linux 网络分析实用的命令
查看>>
关于 linux中TCP数据包(SKB)序列号的小笔记
查看>>
linux TCP数据包封装在SKB的过程分析
查看>>
linux TCP头部的构造的简单分析
查看>>
linux TCP数据包重传过程----小结
查看>>
linux TCP发送源码学习(3)--tcp_transmit_skb
查看>>
linux TCP发送源码学习(2)--tcp_write_xmit
查看>>
linux TCP发送源码学习(1)--tcp_sendmsg
查看>>
linux ubutun 12.04安装JDK
查看>>
linux ubutun12.04在win7上的安装出现“等待下载amd64.tar.xz”问题的解决方案
查看>>
linux:如何在Linux下统计高速网络中的流量
查看>>
linux:实用的工具.....持续更新中
查看>>
linux:关于Linux系统中 CPU Memory IO Network的性能监测
查看>>
SYN cookies机制下连接的建立
查看>>
shell脚本:test命令 if-then for while 学习笔记
查看>>
linux c编程:make Makefile工具的使用
查看>>
linux内核线程的创建与销毁
查看>>
谈谈字符编码
查看>>