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 = n1^P + ... nK^P

where ni (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



本题考察了DFS的回溯剪枝。

为了顺应题目找到最大系数和或者最大系数列,我们从小到大进行枚举,这样即使碰到了和相等的情况,由于是递增着枚举的,因此直接覆盖原来的系数列,得到的就是最终满足条件的系数列。

我们利用DFS来从小到大的枚举,DFS函数的参数如下:

dfs(long long N, int cur, vector<int>& factors);

①其中N是当前值,从最初的输入开始,逐步减去每个系数的运算结果;cur是枚举到的位置,从0开始,依次填入factors容器中,当cur==K时,枚举已经结束,我们判断N是否为0,为0则找到了一个满足条件的系数列,并且这个系数列按照升序存储在factors中。注意到cur==K但N≠0是我们的第一个剪枝条件

②为了保证枚举从小到大开始,在每次枚举开始前计算lower和upper两个值,其中lower由factors中刚刚枚举完的上一个值确定,如果当前是枚举的起始点,则从1开始;upper为根号下N,因为系数的次方P>1,因此最大的系数不可能超过根号N。

③对lower到upper内的每一个值,计算系数的P次方,用res表示。如果N≥res,则说明合法,将其填入factors中并且向后枚举,即

factors[cur] = i;
dfs(N-res,cur+1,factors);

如果N<res,说明系数偏大,又因为系数是递增枚举的,所以此后都不满足,直接返回,这是我们的第二个剪枝条件

综合上面两个剪枝条件,即可写出高效的dfs算法来枚举结果,为了能得到满足题目要求的系数列,我们设置全局变量nowSum和finalFactor,每次找到一个系数列,就求其系数和sum,如果sum≥nowSum,则更新nowSum与finalFactor,等号涵盖了题目中的第二个条件,因为后面出现的系数列一定大于前面出现的系数列(递增枚举)。


最后如果finalFactor规模为K,则说明找到,先反转,后输出,注意格式;否则输出Impossible。


代码如下:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>using namespace std;typedef long long lint;lint N,K;
int P;lint lpower(lint n, lint p){if(n == 1) return 1;int factor = n;for(int i = 1; i < p; i++) n *= factor;return n;
}vector<int> finalFactor;
int nowSum = 0;bool dfs(lint N, int cur, vector<int>& factors){if(cur == K){if(N == 0){int sum = 0;for(int i = 0; i < factors.size(); i++){sum += factors[i];}if(sum >= nowSum){finalFactor = factors;nowSum = sum;}return true;}else return false;}lint upper = sqrt((double)N);lint lower = cur > 0 ? factors[cur - 1] : 1;for(lint i = lower; i <= upper; i++){lint res = lpower(i,P);if(N >= res){factors[cur] = i;dfs(N-res,cur+1,factors);}else{return false;}}return true;
}int main()
{cin >> N >> K >> P;vector<int> factors(K);dfs(N,0,factors);reverse(finalFactor.begin(),finalFactor.end());if(finalFactor.size() == K){printf("%d = ",N);printf("%d^%d",finalFactor[0],P);for(int i = 1; i < finalFactor.size(); i++){printf(" + %d^%d",finalFactor[i],P);}}else{cout << "Impossible";}cout << endl;return 0;
}


转载于:https://www.cnblogs.com/aiwz/p/6154028.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java EE 6与Spring Framework:技术决策过程

在过去的几个月中&#xff0c;我们经历了这个决策过程&#xff1a;为Java平台上的企业开发选择哪种技术堆栈&#xff1f; 有多种选择。 但是&#xff0c;我们深入讨论的是&#xff1a;纯Java EE 6堆栈与带有Java EE的Spring。 以下博客文章总结了当您考虑这些技术堆栈选项之一时…

DOM 基础 HTML标签 元素 属性

什么是HTML标签 HTML标签标记了HTML文档和HTML元素 HTML标签由开始标签和结束标签组成.开始标签为尖括号包围的元素名,结束标签为尖括号包围的斜杠和元素名 例如:<h2> My First Heading</h2> HTML基本标签 标题(Heading)是通过h1 - h6等标签进行定义的.段落 是通过…

允许服务与桌面交互_vivo 正式推出 Origin OS,融合自然设计与全新交互

点击右上角关注我们&#xff0c;每天给您带来最新最潮的科技资讯&#xff0c;让您足不出户也知道科技圈大事&#xff01;今天下午&#xff0c;vivo 推出了全新 Origin OS 手机系统。它采用了源于自然界的设计理念&#xff0c;同时加入了全新并且允许用户进行深度自定义的交互方…

Error - Found cycle in the ListNode

Error - Found cycle in the ListNode 刷力扣时遇到这个错误&#xff0c;节点成环 自己摸索了一下发现确实形成循环&#xff0c;原题是206反转链表&#xff0c;我用的是栈&#xff0c;先将链表节点依次进栈&#xff0c;然后依次出栈链接&#xff0c;构成反转。但是我忽略了第一…

JUnit 4.9(测试版3)中的规则

不久前&#xff0c; David Saff宣布了JUnit 4.9的beta版 。 因此&#xff0c;我认为现在是研究该版本中的新增功能的好时机。 JUnit领域中最有用的创新之一是Rule。 我在这里写了有关规则的文章 。 我在这里写了有关JUnit规则的用例 。 规则很棒。 借助JUnit 4.9&#xff0c;它…

计算机网络-终端

我们常用的电脑来说&#xff0c;外围设备就是终端。 外围设备包括显示器、鼠标、键盘等等。 负责向主机输入数据的就叫输入终端&#xff0c;比如鼠标、键盘、麦克风、摄像头&#xff1b; 负责接收主机输出数据的设备就被称作输出终端&#xff0c;比如显示器、耳机。 注意一点…

为什么我喜欢Java的细节

他们说&#xff0c;Java太冗长了。 您可以找到Hello World程序的比较结果&#xff0c;这些程序在ruby中使用2行&#xff0c;在Java中使用10行&#xff0c;要读取文件&#xff0c;您需要使用Java 20行和php中1行。 尽管示例经常被夸大&#xff08;例如&#xff0c;计算导入次数&…

dll 源码_【技术分享】 | 一个JAVA内存马的源码分析

前言偶然接触到了这样一个JAVA内存马&#xff0c;其作者也是冰蝎的作者&#xff0c;项目地址&#xff1a;https://github.com/rebeyond/memShell正好最近在接触JAVA&#xff0c;借此机会学习下大佬的代码&#xff0c;对自己的编程思路也有了一定的提升。当然笔者只是一个脚本小…

ThunderSearch(闪电搜索器)_网络空间搜索引擎工具_信息收集

文章目录 ThunderSearch简介1 项目地址2 使用方式2.1 配置文件config.json说明2.2 构建和运行 3 使用式例 ThunderSearch简介 ThunderSearch&#xff08;闪电搜索器&#xff09;是一款使用多个(【支持Fofa、Shodan、Hunter、Zoomeye、360Quake网络空间搜索引擎】网络空间搜索引…

字符串匹配方法

介绍两种字符串匹配方法1.暴力匹配母串用s表示&#xff0c;长度为m子串用p表示&#xff0c;长度为n时间复杂度为:(m-n1)n算法&#xff1a;从s串的第一个字符开始匹配&#xff0c;若匹配&#xff0c;继续根据p向后匹配&#xff0c;若后续的不匹配&#xff0c;s右移重新匹配p 2.K…

区分几进制的标志

自己总是记不住进制的开头标记&#xff0c;就写下来忘了就看看 1.二进制&#xff1a;Binary&#xff0c;数字以0b 、0B开头 2.八进制&#xff1a;octal number system&#xff0c;数字自然以0打头 3.十六进制&#xff1a;hexadecimal&#xff0c;以0x、0X开头

每个人都知道MVC…

从一个最近的博客中&#xff0c;您可能已经了解到我最近一直在进行一些采访&#xff0c;因为他们是针对Web应用程序开发人员的&#xff0c;所以我问的一个问题是“您能解释一下MVC模式是什么吗&#xff1f;”&#xff0c;值得称赞的是&#xff0c;每个候选人知道答案。 对于不认…

php无限分类

无限循环 1.需要套2个foreach 2.2个foreach结构一样 纯代码获取数据 public function CycleData($parent_id0){$where[parent_id] $parent_id;$res $this->m->where($where)->field(id,name)->select();foreach($res as $k>$v){$result[$v[id]][id] $v[id];$r…

动态网页数据的采集方案

我在上一篇文章中介绍了使用ScrapySharp快速从网页中采集数据&#xff0c;这种方式是通过直接发送的Http请求来获取的原始页面信息&#xff0c;对于静态网页非常有效&#xff0c;但还有许多网站中的页面内容并非全部存放在原始的页面中&#xff0c;很多内容是通过javascript来动…

r语言ggplot2 多线图绘制图例_plotnine: Python版的ggplot2作图库

腾讯课堂 | Python网络爬虫与文本数据分析同样的基本作图任务&#xff0c;plotnine比matplotlib和seaborn代码量少&#xff0c;更美观。所以我又重新发一遍&#xff0c;大家可以先收藏起来&#xff0c;后面总有用到的时候~R语言的ggplot2绘图能力超强&#xff0c;python虽有mat…

单元和集成测试的代码覆盖率

我最近在一个宠物项目中着手构建自动化的UI&#xff08;集成&#xff09;测试以及普通的单元测试。 我想将所有这些集成到我的Maven构建中&#xff0c;并提供代码覆盖率报告&#xff0c;以便我可以了解测试覆盖率不足的区域。 我不仅发布了项目的源代码&#xff0c;还整理了一个…

javascript事件与event对象的属性

javascript事件列表解说事件浏览器支持解说一般事件onclickIE3、N2鼠标点击时触发此事件ondblclickIE4、N4鼠标双击时触发此事件onmousedownIE4、N4按下鼠标时触发此事件onmouseupIE4、N4鼠标按下后松开鼠标时触发此事件onmouseoverIE3、N2当鼠标移动到某对象范围的上方时触发此…

感想

读完三篇文章看到了前辈们的努力与坚持和对各自的学科的热爱&#xff0c;以及各位前辈的奋斗的艰苦环境&#xff0c;我与那些前辈相比也许还达不到前辈们的那种级别&#xff0c;但是我的学习的条件却比那些前辈们好的多&#xff0c;看完前辈们的奋斗史&#xff0c;以及前辈们的…

python学生分布_Python数据分析实战之分布分析

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者&#xff1a;严小样儿 分布分析法&#xff0c;一般是根据分析目的&#xff0c;将数据进行分组&#xff0c;研究各组别分布规律的一种分析方法。…

使用Spring Security 3.1保护RESTful Web服务,第3部分

1.概述 本教程显示了如何使用Spring和基于Java的Spring Security 3.1来保护REST服务 。 本文将重点介绍如何使用“登录和Cookie”方法专门针对REST API设置安全配置。 2. Spring Security的体系结构完全基于Servlet过滤器&#xff0c;因此&#xff0c;在HTTP请求处理方面&…