POJ3252 RoundNumbers 排列組合

2022-02-14 03:51:10 字數 1171 閱讀 3257

當乙個數的二進位制表示中,0的個數大於或等於1的個數時,叫做roundnumber。求從s到f兩個數(包含)之間的roundnumber個數。

這類題一般都是先求出0到n的個數,然後兩個相減。

由於題目是考慮二進位制中01的個數,當位數固定時,很方便計算。於是從位數方面解決問題。

設n表示成二進位制的位數為len。把0到n分為兩部分。

-位數為[0,len-1]時,可以通過簡單的排列組合計算出結果。

-位數為len時,逐位進行分析。假設n是24,表示成二進位制是1 1000,1的個數是2,len/2 =2。

最高位一定是1,否則就不是len位了。

第二位是1,如果第二位是0,則後面的三位可以有乙個1,也可以沒有1,roundnumber就是c3

1 +c3

0 個。

後面的位都是0,這時不能將其替換成1,從0變成1將會比n更大。

於是分兩步就求助了0-n的個數。

中間有兩個小問題。乙個是組合數的計算,我是從kuangbin那裡抄的遞推寫法。關於組合數的計算還要再學習乙個,最近數學專題。。。

還有就是邊界問題。

#include #include 

#include

using

namespace

std;

unsigned

ints,f;

int c[33][33

];void

init()

}int getbit(unsigned intx)}

int get1(unsigned int

x)

return

ans;

}unsigned

int get0to1(unsigned int

x) }

return

ans;

}int get0(unsigned int

x)

return

ans;

}unsigned

int get1tox(unsigned int

x)

else

cur++;}}

return

ans;

}int

main()

}

還有就是邊界問題了。

poj解題報告 3252

我實在對這題無語啊,做了一星期啊,那叫乙個坑啊,題意不難理解,如果乙個十進位制數轉成二進位制數時,其0的個數不少於1的個數則為,round number。問一段區間裡的round number的個數。這還是比較容易想到用組合數的,關鍵在於怎麼用。實在是沒轍了,就看了看discuss,又看了看大神的 ...

poj3252(數字dp)(模板)

題意 求 l,r 之間的round number數,rn數即化為二進位制後0的個數不少於1的個數的數。思路 之前用組合數求寫過,最近學數字dp,又用數字dp來寫一次。用dp pos n0 n1 表示長為pos 1的數 我從0開始定義的 之前已經有n0個0和n1個1的前提下rn數有多少,用lead表示...

poj 3252 數字dp 數字統計)

就是統計每個數不算本身的round數,具體解法如下 前前後後做過三遍,每一次都wa了好多次 dp解法 include include include include define max 40 using namespace std typedef int ll ll dp max max void...