文章出處:
任何數都能分解成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 不過我乙個同學用了乙個更加簡便的方法 用這個數和比...