PAT 1103 Integer Factorization[难]
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 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
题目大意:输入一个数N,以及数量K,指数P,将N用K个数的N次方的和进行表示。如果相同输出因子数最小的,如果还相同,那么输出较大(字典序较大的)的那个。
//感觉好难,是不是dfs什么的?果然大佬觉得有趣的题目都这么难。
考点是DFS+剪枝。
代码来自:https://www.liuchuo.net/archives/2451
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int n, k, p, maxFacSum = -;
vector<int> v, ans, tempAns;
void init() {
int temp = , index = ;
while (temp <= n) {
v.push_back(temp);
temp = pow(index, p);
index++;
}
}
//index表示当前可用的数最大的下标。
//底数和tempSum
//个数要求tempK
//facSum底数积
void dfs(int index, int tempSum, int tempK, int facSum) {
if (tempK == k) {
if (tempSum == n && facSum > maxFacSum) {
ans = tempAns;//新解赋值
maxFacSum = facSum;
}
return;
}
while(index >= ) {//这个index从大到小的过程,就保证了是按字典序从大到小排列的。
if (tempSum + v[index] <= n) {
tempAns[tempK] = index;
dfs(index, tempSum + v[index], tempK + , facSum + index);
}
if (index == ) return;
index--;
}
}
int main() {
scanf("%d%d%d", &n, &k, &p);
init();
tempAns.resize(k);
dfs(v.size() - , , , );
if (maxFacSum == -) {
printf("Impossible");
return ;
}
printf("%d = ", n);
for (int i = ; i < ans.size(); i++) {
if (i != ) printf(" + ");
printf("%d^%d", ans[i], p);
}
return ;
}
//真的是学习了!
1.注意剪纸,dfs里需要有这一句:if (tempSum + v[index] <= n) 这样比进入下一层要开销小很多。
下面这个代码来自:https://www.cnblogs.com/chenxiwenruo/p/6119360.html
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <cmath>
using namespace std;
/**
其实可以预先把i^p<n的i都存储起来
**/
const int maxn=;
int res[maxn];
int ans[maxn];
int factor[maxn];
int fidx=;
int maxsum=;
bool flag=false;
int n,k,p;
/**
num为当前的总和
cnt为还剩几个i^p项,即当前的k
sum为各因子的总和,因为要取和最大的
last为上一个因子的索引,因为要保证因子从大到小输出,
所以dfs后一个因子在factor中的索引不能大于上一个
**/
void dfs(int num,int cnt,int sum,int last){
if(num==&&cnt==){
if(sum>maxsum){
flag=true;
for(int i=;i<=k;i++)
ans[i]=res[i];
maxsum=sum;
}
return;
}
else if(cnt==)
return;//计数用完了,但是不符合=n的要求
for(int i=last;i>=;i--){
int left=num-factor[i];
res[cnt]=i+;
dfs(left,cnt-,sum+i,i);
}
} int main()
{
scanf("%d %d %d",&n,&k,&p);
int tmp=;
fidx=;
//预先存储i^p<=n的i
while(tmp<=n){
factor[fidx]=tmp;
fidx++;
tmp=pow(fidx+,p);
}
int cnt=;
int last=fidx-; dfs(n,k,,last);
if(flag){
printf("%d =",n);
for(int i=k;i>=;i--){
printf(" %d^%d +",ans[i],p);
}
printf(" %d^%d",ans[],p);
}
else{
printf("Impossible");
} return ;
}
//但是这个目前有点问题,今晚修改一下,看问题出在哪,顺便也是学习了!
PAT 1103 Integer Factorization[难]的更多相关文章
- PAT 1103 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 positi ...
- PAT甲级1103. Integer Factorization
PAT甲级1103. Integer Factorization 题意: 正整数N的K-P分解是将N写入K个正整数的P次幂的和.你应该写一个程序来找到任何正整数N,K和P的N的K-P分解. 输入规格: ...
- PAT甲级——1103 Integer Factorization (DFS)
本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90574720 1103 Integer Factorizatio ...
- 1103 Integer Factorization (30)
1103 Integer Factorization (30 分) The K−P factorization of a positive integer N is to write N as t ...
- 【PAT】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 positi ...
- PAT (Advanced Level) 1103. Integer Factorization (30)
暴力搜索. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...
- PAT甲级1103 Integer Factorization【dfs】【剪枝】
题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224 题意: 给定一个数n,要求从1~n中找 ...
- PAT甲题题解-1103. Integer Factorization (30)-(dfs)
该题还不错~. 题意:给定N.K.P,使得可以分解成N = n1^P + … nk^P的形式,如果可以,输出sum(ni)最大的划分,如果sum一样,输出序列较大的那个.否则输出Impossible. ...
- 【PAT甲级】1103 Integer Factorization (30 分)
题意: 输入三个正整数N,K,P(N<=400,K<=N,2<=P<=7),降序输出由K个正整数的P次方和为N的等式,否则输出"Impossible". / ...
随机推荐
- JSP中使用Spring注入的Bean时需要注意的地方
遇到问题 遇到一个问题:在JSP中,使用Spring注入的Bean对象时,未能正确地获取到想要的对象. 郁闷的是,它也没报错. 研究问题 使用DEBUG功能(好久不在JSP里写Java代码了,都忘了J ...
- PCL—低层次视觉—关键点检测(iss&Trajkovic)
关键点检测往往需要和特征提取联合在一起,关键点检测的一个重要性质就是旋转不变性,也就是说,物体旋转后还能够检测出对应的关键点.不过说实话我觉的这个要求对机器人视觉来说是比较鸡肋的.因为机器人采集到的三 ...
- C#、Java实现按字节截取字符串包含中文汉字和英文字符数字标点符号等
C#.Java实现按字节截取字符串,字符串中包含中文汉字和英文字符数字标点符号等. 在实际项目应用过程中,尤其是在web开发时可能遇到的比较多,就以我的(JiYF笨小孩管理系统)为例,再发布文章时候, ...
- XCode 遇到的问题
俗话说:工欲善其事必先利其器.抛弃了VS,投入XCode的怀抱.先不说两者的差距,还是先熟悉开发工具是关键.下面列出个人使用中遇到的一些问题. Problem1:修改Xcode字体颜色以及调整字体大小 ...
- 查看JVM使用的默认的垃圾收集器
一.查看步骤 cmd执行命令: java -XX:+PrintCommandLineFlags -version 输出如下(举例): 针对上述的-XX:UseParallelGC,这边我们引用< ...
- MySQL优化之SQL耗时瓶颈 SHOW profiles
1.首先查看是否开启profiling功能 SHOW VARIABLES LIKE '%pro%'; 或者 SELECT @@profiling; 2.开启profiling SET profilin ...
- tars环境部署
author: headsen chen date: 2018-10-18 12:35:40 注意:依据Git上的tars搭建步骤整理而来 参考: https://max.book118.com/h ...
- 使用docker搭建公司redmine服务器
What is Redmine? Redmine is a flexible project management web application. Written using the Ruby on ...
- INTRO: THE DAWN (亡灵序曲) 中独白
As the last ship sailed towards the distant horizon I sat there watching on a rock My mind slowly dr ...
- Windows Server 2008 R2之五操作主控的管理
一.概述 操作主控(FSMO)也称作操作主机(OM),它是指在AD中一个或多个特殊的DC,用来执行某些特殊的功能(资源标识符SID分配.架构修改.PDC选择等). 1.操作主控的分类 基于森林的操作主 ...