CSP J2020普及組複賽T1 優秀的拆分

2021-10-10 08:57:04 字數 1707 閱讀 6979

一般來說,乙個正整數可以拆分成若干個正整數的和

例如,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

輸出樣例1

4 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老師想知道,在商店每種...