poj3252(排列組合計數,數字計數)

2021-07-23 17:25:37 字數 1223 閱讀 9302

/*

translation:

給出兩個數,求這兩個數形成的閉區間內round number的個數。乙個數轉換成二進位制的時候其中0的個數比1多的

或者相等的稱為round number。

solution:

排列組合。

要求閉區間內的round number個數,只需要求出0~s的個數和0~t的個數,將二者相減即可得到答案。

關於個數的計算,可以採用如下方法。當乙個數為n位的二進位制時,只需要令這n位二進位制至少有(n+1)/2

個0,即可滿足條件。利用排列組合的遞推公式可以輕鬆做到。再利用加法原理求出來答案。

note:

1:利用上述方法可以求出來0~n-1位所有二進位制數的round number個數,但是還有一些n位的二進位制沒有計算。

而根據給的資料範圍來看,這些遺漏的數的個數可能達到10^9個之多。本來想對這些「漏網之魚」用暴力計算,但

這樣一來肯定超時。想來想去沒有想到好辦法。後來看題解採用了下面這種方法:

首先明白,要計算的數肯定都比所給定的數小,但是二進位制位數都一樣。所以對二進位制位從高到低掃瞄,遇到0的話用乙個變數

計數,遇到1的話,將當前位當成0,這樣後來的無論怎麼組合都是小於原數的,所以計算的時候要多減去乙個1.同時同樣利用排列組合

計數。date:

2016.10.14

*/#include #include #include using namespace std;

const int maxn = 35;

int s, t;

int c[maxn][maxn], bit[maxn]; //bit[i]表示i位二進位制位在最高位是1的情況下能夠表示最少的數字

int cnt[maxn];

int bin[maxn];

void init()

} memset(cnt, 0, sizeof(cnt));

for(int i = 1; i <= maxn; i++) }}

void getbit(int x)

}int compute(int x)

int zeronum = 0;

for(int i = bin[0]-1; i >= 1; i--)

else zeronum++;

} return res;

}int main()

return 0;

}

8 排列組合

1 2 permutations 3 排列組合 4 輸入abc,輸出所有可能的排列結果 5 輸入 abc 6 輸出 abc 7 acb 8 bac 9 bca 10 cab 11 cba 12 1314 include15 16using namespace std 1718 int c1 0 19...

POJ 1469 排列組合的思維

題意就是說給一列序列.其順序是 1 a 2 b 26 z 27 ab.28 ac.51 az.52 bc.類似這樣.其中的字串都是每一位比前一位大.最長為vwxyz.給出乙個字串.求出其在佇列中的序列號.這道題就是用乙個排列組合.比如求 bdf 求出1位和2為總共有多少個.然後每一位就依次求出前一位...

hdu 1716 排列2 排列組合

問題描述 ray又對數字的列產生了興趣 現有四張卡片,用這四張卡片能排列出很多不同的4位數,要求按從小到大的順序輸出這些4位數 input 每組資料佔一行,代表四張卡片上的數字 0 數字 9 如果四張卡片都是0,則輸入結束。output 對每組卡片按從小到大的順序輸出所有能由這四張卡片組成的4位數,...