一般來說,乙個正整數可以拆分成若干個正整數的和
例如,1=1
1=11=
1,10=1
+2+3
+4
10=1+2+3+4
10=1+2
+3+4
等。對於正整數 n
nn 的一種特定拆分,我們稱它為「優秀的」,當且僅當在這種拆分下,nnnn
nn被分解為了若干個不同的 2
22 的正整數次冪。注意,乙個數 x
xx 能被表示成 2
22 的正整數次冪,當且僅當 x
xx 能通過正整數個 2
22 相乘在一起得到。
例如,10=8
+2=2
3+21
10=8+2=2^3+2^1
10=8+2
=23+
21,是乙個優秀的拆分。但是,7=4
+2+1
=22+
21+2
07=4+2+1=2^2+2^1+2^0
7=4+2+
1=22
+21+
20,就不是乙個優秀的拆分,因為 1
11 不是 2
22 的正整數次冪。
現在,給定正整數 n
nn,你需要判斷這個數的所有拆分中,是否存在優秀的拆分。若存在,請你給出具體的拆分方案。
輸入格式
輸入只有一行,乙個整數 n
nn,代表需要判斷的數。
輸出格式
如果這個數的所有拆分中,存在優秀的拆分。那麼,你需要從大到小輸出這個拆分中的每乙個數,相鄰兩個數之間用乙個空格隔開。可以證明,在規定了拆分數字的順序後,該拆分方案是唯一的。
若不存在優秀的拆分,輸出 −1-1
−1。輸入樣例1
輸出樣例14 2輸入樣例2 輸出樣例2
-1通過題目可以發現,奇數不存在優秀的拆分方案,因為肯定存在乙個2
02^0
20。偶數一定存在乙個優秀拆分方案,因為任何乙個十進位制數都可以用2
22的整數次冪的和表示出來。
通過分析輸出樣例,發現需要從大到小輸出方案,那麼要首先找到小於等於正整數n
nn的最大的2的正整數次冪,將其從n
nn中減去,重複這個過程,直到n
nn等於0。
l og
(n
)log(n)
log(n)
#include
using
namespace std;
intmain()
//找到小於等於正整數n的最大的2的正整數次冪m
int m =2;
while
(m < n) m *=2
;if(m > n) m /=2
;while
(n)return0;
}
2019CSP J普及組 T1 數字遊戲
p5660 數字遊戲 題目傳送門 沒什麼好說的,按照慣例,t1還是這麼簡單!方法一 include include include include include include define fre x freopen x in r stdin freopen x out w stdout usi...
2020CSP J普及組複賽(民間資料)題解
這一道題就是一道簽到題 這道題我們可以很快速的發現,若n為奇數 即n 2 1 則n必定無法拆分 若n為偶數,其實就只需要有以下操作 1.先通過計算2的k次冪,找到第乙個滿足大於等於n的值 2.計算當n k 0時,輸出k,隨後將k k 2 最後當n等於0,則輸出即為其優秀拆分 還可以直接把2的次冪打出...
買鉛筆 noip2016普及組T1
p老師需要去商店買n支鉛筆作為小朋友們參加noip的禮物。她發現商店一共有 3種包裝的鉛筆,不同包裝內的鉛筆數量有可能不同,也有可能不同。為了公平起 見,p老師決定只買同一種包裝的鉛筆。商店不允許將鉛筆的包裝拆開,因此p老師可能需要購買超過n支鉛筆才夠給小朋 友們發禮物。現在p老師想知道,在商店每種...