POJ1850 遞推關係

2021-06-28 19:13:15 字數 1236 閱讀 5760

2015/2/22

還是先得打表,求出組合數

然後再問你 abcd 十進位制是多少?

答: 乙個字母的組合數 + 兩個字母的...+三個的+ 1 = num(abcd)

當然 一般的通解是 計算完 1 ~len-1的組合數之和後 還要計算 同長度的有幾個字串(如果讓你求 abdf  呢?)

那麼麻煩就在於計算同長度的組合數量的時候。

由於字串是公升序(可以先判斷下)加上 每個字母的數值 取決於前乙個字母    ab  b = 1; bc  c = `1;

將s[ 0 ]的前置預設為 『a';

然後開始計算每個位子上達到目標字母需要滾動過多少字串   

這個文字解釋有點難,但還是組合數的道理(我就舉個例子,具體自己看**)

從  』a『 開始計算,也是 最後 計算得出的sum需要加 1的原因

比如  ab ,要想得到十位的 a ,需要 個位的字母滾動26次 

比如  bc ,想要得到』 b『 那麼先得得到 』a『  所以總共滾動了 26 + 25次。

再擼**就容易很多了。

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

#define mod 10007

#define lson pos<<1,l,mid

#define sc(n) scanf("%d",&n)

#define rson pos<<1|1,mid+1,r

#define pr(n) printf("%d\n",n)

#define met(n,m) memset(n, m, sizeof(n))

#define f(x,y,i) for(int i = x;i > y; i--)

#define f(x,y,i) for(int i = x;i < y; i++)

#define ff(x,y,i) for(int i = x;i <= y; i++)

#define ff(x,y,i) for(int i = x;i >= y; i--)

const int n=100500;

const int inf = int_max;

int max(int a,int b)

int min(int a,int b)

{ return a

poj1850組合數學

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

POJ 1850 Code 組合數學)

題意 求str在字典中的編號。字典中的字串都是嚴格公升序排列,而且長度遞增的。a z為1 26,然後是ab az 分別編號為27 51,然後是bc bz。分析 1 首先可以確定長度比str小的總共有多少個。比如長度為2的就有c 26,2 個,相當於26個字元中選2個,由於預設是公升序排列,不會重複,...

組合數學 POJ 1850 Code

poj 1850 比如說求比358小的由1 9的數字組成的數 0不算 而且要求後面乙個數一定比前乙個數大,而且數字不能重複,類似於這個意思,這題是字母,當做數字範圍1 26就行 對於358來說 c 9,2 c 9,1 c 7,2 c 8,2 c 6,2 不想寫了,應該沒算錯 兩位數和一位數,一定比 ...