poj3252組合數學

2021-08-06 04:57:51 字數 1289 閱讀 8959

題意:乙個數轉換成二進位制數,零的個數大於等於一的個數的數稱為圓數,例如9轉換成1001,0的個數為2,1的個數為2,所以9為圓數;輸入兩個數start和end,問start到end有多少個圓數。

思路:start到end中有多少個圓數,我們只需要求出num[0,start]和num[0,end),num[0,start]-num[0,end)即為所求;

以二進位制數10011000為例,位數為8,那麼位數小於8的圓數有多少個?

以位數為7的情況來解釋,首先保證沒有前導0,這樣只需要考慮剩下的6位,然後要保證零的個數大於等於一的個數,即從6個位置裡面挑出大於等於一半的位置為0,組合問題不用多說了吧。列舉位數小於8的情況,再列舉為圓數的情況,求和即可;

當位數等於8時,首先我們既要保證前導零,又要保證所列舉的數不能大於本身,那麼我們從第二位開始列舉每一位,記下零的個數,當枚到1時,情況就於位數小於的情況一樣。一樣的處理方式。詳情看**吧。

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define maxn 33000

#define inf 0x3f3f3f3f

#define lmid l,m,rt<<1

#define rmid m+1,r,rt<<1|1

#define ls rt<<1

#define rs rt<<1|1

#define mod 1000000007

#define i64 __int64

#define limit_ull 100000000000000000

#define max(a,b) (a>b)?a:b

#define lowbit(x) x&(-x)

using

namespace

std;

typedef

long

long ll;

int c[33][33]=;//c[i][j]表示從i個物品中挑j個的情況數

int bin[35];

void deal()//組合數打表

}void dealbin(int n)//轉換成二進位制

}int solve(int n)

}else zero++;

}return sum;

}int main()

poj3252 組合數學

題意 給出乙個範圍,然後問這個範圍內有幾個是round number round number也就是轉化二進位制後,的個數大於等於 的個數 思路 這是乙個組合計數的問題 我們拿乙個二進位制長度為 的數舉例子 如果長度為 那麼所有長度為 以下的數字,肯定都是在範圍內的,那麼我們就要找出所有符合條件的數...

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前面的有多...