究極無敵臥槽2的冪數

2021-09-09 07:13:59 字數 2240 閱讀 9248

文章出處:

任何數都能分解成2的冪,

例如:7

=1+1+1+1+1+1+1

=1+1+1+1+1+2

=1+1+1+2+2

=1+1+1+4

=1+2+2+2

=1+2+4

求任意整數n(n<100億)的此類劃分數。

解:記f(n)為n的劃分數,我們有遞推公式:

f(2m + 1) = f(2m),

f(2m) = f(2m - 1) + f(m),

初始條件:f(1) = 1。

證明:證明的要點是考慮劃分中是否有1。

記:a(n) = n的所有劃分組成的集合,

b(n) = n的所有含有1的劃分組成的集合,

c(n) = n的所有不含1的劃分組成的集合,

則有: a(n) = b(n)∪c(n)。

又記:f(n) = a(n)中元素的個數,

g(n) = b(n)中元素的個數,

h(n) = c(n)中元素的個數,

易知: f(n) = g(n) + h(n)。

以上記號的具體例子見文末。

我們先來證明: f(2m + 1) = f(2m),

首先,2m + 1 的每個劃分中至少有乙個1,去掉這個1,就得到 2m 的乙個劃分,故 f(2m + 1)≤f(2m)。

其次,2m 的每個劃分加上個1,就構成了 2m + 1 的乙個劃分,故 f(2m)≤f(2m + 1)。

綜上,f(2m + 1) = f(2m)。

接著我們要證明: f(2m) = f(2m - 1) + f(m),

把 b(2m) 中的劃分中的1去掉乙個,就得到 a(2m - 1) 中的乙個劃分,故 g(2m)≤f(2m - 1)。

把 a(2m - 1) 中的劃分加上乙個1,就得到 b(2m) 中的乙個劃分,故 f(2m - 1)≤g(2m)。

綜上,g(2m) = f(2m - 1)。

把 c(2m) 中的劃分的元素都除以2,就得到 a(m) 中的乙個劃分,故 h(2m)≤f(m)。

把 a(m) 中的劃分的元素都乘2,就得到 c(2m) 中的乙個劃分,故 f(m)≤h(2m)。

綜上,h(2m) = f(m)。

所以: f(2m) = g(2m) + h(2m) = f(2m - 1) + f(m)。                                            

這就證明了我們的遞推公式。

記 f(0) = 1,根據遞推公式,可以得到:

f(2m) = f(0) + f(1) + ... + f(m)。

(證明留給讀者)

一些例子:

a(3) = ,

f(3) = 2,

a(4) = ,

f(4) = 4,

a(5) = ,

f(5) = 4,

a(6) = ,

f(6) = 6,

b(6) = ,

g(6) = 4,

c(6) = ,

h(6) = 2.

結合今天的這道題:

題目描述

小明開始學習二進位制轉化到十進位制,其中要用到2的冪(2的3次冪就是3個2相乘),他覺得這個很有意思。既然通過2的冪相加可以得到十位數,那麼反過來,乙個十進位制數是否可以通過若干個2的冪相加得到呢?

小明開始研究起來,他先列出了所有2的冪:1,2,4,8,16,32,64……。

4=1+1+1+1

4=1+1+2

4=2+2

4=4                 4共有4種方法

7=1+1+1+1+1+1+1

7=1+1+1+1+1+2

7= 1+1+1+2+2

7=1+1+1+4

7=1+2+2+2

7= 1+2+4       

共有6種方法。1+2+4和2+1+4認為是同乙個等式,因為它們的組成相同。

現在小明想要知道,給出乙個十進位制數,可以寫出多少種,用若干個2的冪數相加的式子。

輸入第一行包含1個正整數n, 1<=n<=1000。

輸出共1行,n能用2的冪數相加的不同式子的種數。

複製樣例資料

7
樣例輸出

6
#include using namespace std;

int fun(int n)

int main()

{ int n;

cin>>n;

cout《我沒找出這個規律

無敵二次冪 如何判斷乙個數是不是2的冪數)

磊哥為測驗小凡的位運算知識,給小凡n個long long 型整數,磊哥問小凡其中有多少個2次冪數?輸入第一行輸入整數n.接下來n個long long 型整數。輸出輸出其中值為2次冪的數的個數。提示100 的資料滿足 1 n 6 000,000 n個正整數均保證是long long 型正整數。由於資料...

石油大 2的冪數(思維)

時間限制 1 sec 記憶體限制 128 mb 題目描述 小明開始學習二進位制轉化到十進位制,其中要用到2的冪 2的3次冪就是3個2相乘 他覺得這個很有意思。既然通過2的冪相加可以得到十位數,那麼反過來,乙個十進位制數是否可以通過若干個2的冪相加得到呢?小明開始研究起來,他先列出了所有2的冪 1,2...

確定乙個數是不是2的冪

昨天看到淘公尺網路的一道程式設計題,給定乙個數判斷這個數是不是2的冪。我自己想到的使用遞迴的方法進行實現,如下。class squ2 public static boolean is2 int a if a 2 1 return is2 a a 2 不過我乙個同學用了乙個更加簡便的方法 用這個數和比...