/*
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位數,...