Integer Factorization

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

题意:给定正整数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\n");
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 }

PAT A1103—DFS的更多相关文章

  1. PAT A1103

    PAT A1103 标签(空格分隔): PAT 解题思路: DFS #include <cstdio> #include <vector> using namespace st ...

  2. PAT A1103 Integer Factorization (30 分)——dfs,递归

    The K−P factorization of a positive integer N is to write N as the sum of the P-th power of K positi ...

  3. PAT A1103 Integer Factorization

    线性dfs,注意每次深搜完状态的维护~ #include<bits/stdc++.h> using namespace std; ; vector<int> v,tmp,pat ...

  4. 简述BFS与DFS

    简述BFS与DFS 最近学习了数据结构课程以及应对蓝桥杯备考,所以花费了一点时间将比较重要的两个搜索BFS(宽度优先搜索)和DFS(深度优先搜索)大致思路以及代码整理出来,如有错误,还请各位大佬批评改 ...

  5. PAT_A1103#Integer Factorization

    Source: PAT A1103 Integer Factorization (30 分) Description: The K−P factorization of a positive inte ...

  6. Bubble Cup 8 finals C. Party (575C)

    题意: 给定n个人,分两天晚上去夜总会开派对,要求每天恰好有n/2个人去,且每人去的夜总会各不相同. 每个人对不同的晚上不同的夜总会有不同的满意度,求一个方案使得所有人的满意度之和最大. 夜总会数量= ...

  7. codechef: BINARY, Binary Movements

    非常有毛病的一道题,我一个一个读字符死活过不去,改成整行整行读就 A 了... 做法就是...最小点覆盖... 我们发现可以把一个点向上跳看做被吃掉了,然后最顶层的点是无法向上跳所以不能被吃掉,然后被 ...

  8. hihoCoder-1829 2018亚洲区预选赛北京赛站网络赛 B.Tomb Raider 暴力 字符串

    题面 题意:给你n个串,每个串都可以选择它的一个长度为n的环形子串(比如abcdf的就有abcdf,bcdfa,cdfab,dfabc,fabcd),求这个n个串的这些子串的最长公共子序列(每个串按顺 ...

  9. CSP-S全国模拟赛第二场 【nan】

    A.count 本场比赛最难的题... 隔板法组合数容斥 xjb 搞搞就好了 //by Judge #include<cstdio> #include<iostream> #d ...

随机推荐

  1. 【数据结构与算法】二叉树的 Morris 遍历(前序、中序、后序)

    前置说明 不了解二叉树非递归遍历的可以看我之前的文章[数据结构与算法]二叉树模板及例题 Morris 遍历 概述 Morris 遍历是一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1 ...

  2. Serverless 架构下的服务优雅下线实践

    作者 | 行松 阿里巴巴云原生团队 应用发布.服务升级一直是一个让开发和运维同学既兴奋又担心的事情. 兴奋的是有新功能上线,自己的产品可以对用户提供更多的能力和价值:担心的是上线的过程会不会出现意外情 ...

  3. cmd下载慢

    是网络的原因,加一个镜像服务器 pip install *** -i https://pypi.tuna.tsinghua.edu.cn/simple

  4. Rclone使用教程 - 挂载Onedrive和谷歌网盘

    1. 介绍 Rclone 是一个用于多个云平台之间同步文件和目录的命令行工具,其支持多种运营商网盘. 官网网址:https://rclone.org 开源地址:https://github.com/n ...

  5. vue3 专用 indexedDB 封装库,基于Promise告别回调地狱

    IndexedDB 的官网 https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API 这个大概是官网吧,原始是英文的,现在陆续是出中 ...

  6. JavaScript03

    类型转换和运算符 typeof函数 检测数据类型,可以使用以下两种调用的方式: typeof 变量或表达式 typeof(变量或表达式) var n="asda"; console ...

  7. spring security实现简单的url权限拦截

    在一个系统中,权限的拦截是很常见的事情,通常情况下我们都是基于url进行拦截.那么在spring security中应该怎么配置呢. 大致步骤如下: 1.用户登录成功后我们需要拿到用户所拥有的权限,并 ...

  8. 简明教程 | Docker篇 · 其二:Dockerfile的编写

    Dockerfile是什么 一个包含用于组合 image 的命令的文本文件,docker 通过 dockerfile 和构建环境的上下文来构建 image . 编写Dockerfile FROM 首先 ...

  9. 『学了就忘』Linux基础 — 4、VMware安装

    目录 1.VMware介绍 2.VMware主要特点 3.VMware建议配置 4.VMware安装 1.VMware介绍 VMware是一个虚拟PC的软件,可以在现有的操作系统上虚拟出一个新的硬件环 ...

  10. 零基础学习Linux心得总结

    很多同学接触linux不多,对linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一个优秀的软件开发人员,或计算机it行业从业人员,="" 掌握linux是一种很重要的 ...