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

题目大意:输入一个数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[难]的更多相关文章

  1. 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 ...

  2. PAT甲级1103. Integer Factorization

    PAT甲级1103. Integer Factorization 题意: 正整数N的K-P分解是将N写入K个正整数的P次幂的和.你应该写一个程序来找到任何正整数N,K和P的N的K-P分解. 输入规格: ...

  3. PAT甲级——1103 Integer Factorization (DFS)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90574720 1103 Integer Factorizatio ...

  4. 1103 Integer Factorization (30)

    1103 Integer Factorization (30 分)   The K−P factorization of a positive integer N is to write N as t ...

  5. 【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 ...

  6. PAT (Advanced Level) 1103. Integer Factorization (30)

    暴力搜索. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...

  7. PAT甲级1103 Integer Factorization【dfs】【剪枝】

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805364711604224 题意: 给定一个数n,要求从1~n中找 ...

  8. PAT甲题题解-1103. Integer Factorization (30)-(dfs)

    该题还不错~. 题意:给定N.K.P,使得可以分解成N = n1^P + … nk^P的形式,如果可以,输出sum(ni)最大的划分,如果sum一样,输出序列较大的那个.否则输出Impossible. ...

  9. 【PAT甲级】1103 Integer Factorization (30 分)

    题意: 输入三个正整数N,K,P(N<=400,K<=N,2<=P<=7),降序输出由K个正整数的P次方和为N的等式,否则输出"Impossible". / ...

随机推荐

  1. 【JavaScript】如何判断一个对象是未定义的?(已解决)

    JavaScript中,如果使用了一个未定义的变量,会有这样的错误提示:XXX未定义. 代码中,怎样才能判定一个对象是否定义了呢? 使用  typeof 示例: if("undefined& ...

  2. netstat命令的安装

    yum -y install net-tools    (可以生成ifconfig命令,netstat命令)

  3. 调用office COM出现不会退出的问题

    症状 在使用.net调用 Microsoft Office 应用程序时,Office 应用程序在调用Quit方法时不会退出. 原因 Visual Studio.NET 从托管代码调用 COM 对象时, ...

  4. android中SimpleCursorAdapter _id错误的问题

    作为一个android新手,在绑定数据的时候是这样的 ListView listview=(ListView)this.findViewById(R.id.listView1); XJDal xj=n ...

  5. JavaAgent入门

    JavaAgent 是JDK 1.5 以后引入的,也可以叫做Java代理. JavaAgent 是运行在 main方法之前的拦截器,它内定的方法名叫 premain ,也就是说先执行 premain ...

  6. 【CF888E】Maximum Subsequence 折半搜索

    [CF888E]Maximum Subsequence 题意:给你一个序列{ai},让你从中选出一个子序列,使得序列和%m最大. n<=35,m<=10^9 题解:不小心瞟了一眼tag就一 ...

  7. iOS开发过程中使用Core Data应避免的十个错误

    原文出处: informit   译文出处:cocoachina Core Data是苹果针对Mac和iOS平台开发的一个框架,主要用来储存数据.对很多开发者来说,Core Data比较容易入手,但很 ...

  8. nose测试中修改nose_html_reporting插件,使生成的html报告加入显示截图功能

    使用nose框架在测试WEB UI自动化时,使用了第三方插件nose-html-reporting,来生成HTML报告,nose-html-reporting具体使用参见管网https://pypi. ...

  9. java的HashMap 原理

    https://www.cnblogs.com/chengxiao/p/6059914.html 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比 ...

  10. React Native ——入门环境搭配以及简单实例

    一.Homebrew 是OS X 的套件管理器. 首先我们需要获取 Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent. ...