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.pswp.cn/news/374479.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374479.shtml
英文地址,請注明出處:http://en.pswp.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請求處理方面&…