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. 教你 4 步搭建弹性可扩展的 WebAPI

    作者 | 萧起  阿里云云原生团队 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 Se ...

  2. 利用PATH环境变量 - 提升linux权限~👻

    利用PATH提升linux权限 参考地址:https://www.hackingarticles.in/linux-privilege-escalation-using-path-variable/ ...

  3. 找出某名珍贵药材的生长区域(ArcPy实现)

    一.背景 某种珍贵药材生长于山区,通过研究了解到这种药材生长具有严格的生长条件.为了能更好地保护该药材的生长环境,现在需要使用GIS空间分析方法,将药材适合生长区域找出来,以便为该物种保护提供依据. ...

  4. Miller-Rabin and Pollard-Rho

    实话实说,我自学(肝)了两天才学会这两个随机算法 记录: Miller-Rabin 她是一个素数判定的算法. 首先需要知道费马小定理 \[a^{p-1}\equiv1\pmod{p}\quad p\i ...

  5. 洛谷4248 AHOI2013差异 (后缀数组SA+单调栈)

    补博客! 首先我们观察题目中给的那个求\(ans\)的方法,其实前两项没什么用处,直接\(for\)一遍就求得了 for (int i=1;i<=n;i++) ans=ans+i*(n-1); ...

  6. 1002 写出这个数 (20 分) java解题

    读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 n 的值.这里保证 n 小于 10^100. 输出格式: 在一行内输 ...

  7. Linux——Docker安装

    1. 安装Docker i :环境准备:Linux要求内核3.0以上 ii:安装 #1.卸载旧版本 yum remove docker \ docker-client \ docker-client- ...

  8. Windows Terminal 和 WSL

    Windows Terminal ,配置启动目录为 WSL : \\wsl$\Ubuntu\home

  9. Scrum Meeting 0429

    零.说明 日期:2021-4-29 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成部分后端管理 ...

  10. [no code][scrum meeting] Alpha 8

    项目 内容 会议时间 2020-04-14 会议主题 API文档第一版交付 会议时长 30min 参会人员 PM+OCR组成员 $( "#cnblogs_post_body" ). ...