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 不想寫了,應該沒算錯 兩位數和一位數,一定比 ...