poj3252 組合數學

2021-07-04 01:46:49 字數 1133 閱讀 8153

題意:

給出乙個範圍,然後問這個範圍內有幾個是round number;

round number也就是轉化二進位制後,0的個數大於等於1的個數;

思路:這是乙個組合計數的問題;我們拿乙個二進位制長度為10的數舉例子;

如果長度為10;那麼所有長度為10以下的數字,肯定都是在範圍內的,那麼我們就要找出所有符合條件的數;

首先9位的,那麼需要的0的個數是5個以上;那麼長度為9的,出了第一位必須是1剩下八位我們就可以隨意組合選出5個以上的位置填充0;

也就是c(8, 5) + c(8, 6) + c(8, 7) + c(8 , 8);

同理所有長度小於10的全都累加起來;

然後要單獨討論長度為10的,因為這個長度有的數是超出範圍的;

然後我們計算的時候,就從高位往地位列舉;如果出現0,就把0的數量加加;

如果出現1,我們就把這一位置成0,然後剩下的位用上面的辦法算出所有組合;

例如1001100110

長度為10,那麼需要的0的個數就是5個以上;我們從第二位開始(第一位肯定是1不能變)然後到第四位時,出現了1;那如果這一位變成0,那麼剩下的位數就能隨意組合棵,因為肯定比原來數字小,因為原來的位置在比較高的乙個位是1;所以把第四位變成0後,0的個數就是3個了,那麼剩下的6位里還需要2個以上的0;

所以再去加c(6,2)+ c(6,3) + c(6,4) + c(6,5) + c(6,6);

加完後要將0的個數再減一,因為我們把第四位變成0,只是為了計算這一種情況,然後繼續往低位找過去;

#include#include#define ll long long

const int n = 65;

ll c[n][n];

ll b[n];

ll sum;

ll l, r;

int num0, num1;

void getc(int n) }}

ll cul(ll x)

for(int i = 1; i < len; i++)

for(int i = len - 2; i >= 0; i--) else

num0++;

} return sum;

}int main()

}

poj3252組合數學

題意 乙個數轉換成二進位制數,零的個數大於等於一的個數的數稱為圓數,例如9轉換成1001,0的個數為2,1的個數為2,所以9為圓數 輸入兩個數start和end,問start到end有多少個圓數。思路 start到end中有多少個圓數,我們只需要求出num 0,start 和num 0,end nu...

POJ 1850 1496 組合數學

poj 1496 word index poj 1850 code 題意 1.每個詞是自增的 2.同樣長度的詞是按字典序排練的 3.我們把這些詞標序 求某個詞的序號 分析 組合數學.推出公式然後用楊輝三角打錶出組合數,具體看 我還是太弱orz.1496 author illuz file 1496....

poj1850組合數學

題意 給你乙個字串s,輸出s在字典序全排列中的位置 從小到大排列 思路 長度為m的字串有c 26,m 這是顯而易見的,從26個字母中挑m個,因為要公升序排列,所以只有一種排法,即c 26,m 為個數 這樣我們就可以求出長度比字串s小的字串有多少個。len為字串s的長度。長度相同但排在字串s前面的有多...