題意:
給你n個1和m個0,讓你拼成n+m長度的並且所有字首的1都不少於0的個數的串,問有多少種方法。
思路:將構造字串的過程轉化到二維座標上去,1用y表示,0用x表示,從座標(0,0)出發,0代表向右走(x增加),1代表向上走(y增加),因為0有m個,1有n個,所以最後到達的座標為
(m,n) ,單純考慮從0,0走到m,n一共有c(n+m,m)種方法,又因為任意字首中1的個數不能小於0,所以y>=x,也就是合法走的路線經過的座標要麼在y=x上,要麼在其上邊,那麼
不合法的路線經過的座標則滿足y所以不合法的路徑一定與y=x-1相交,找到(0,0)關於y=x-1的對稱點(1,-1),從(1,-1)走到(m,n)一定與直線y=x-1相交,因為m,n在該直線的上邊,1,-1在該直線的下
邊。在這裡設交點為p,那麼路線就以p為分割點可以分為兩部分,上面一部分取個名字叫不合法路線,下面一部分取個名字叫合法路線。那麼從1,-1走到m,n有多少種方法也就
是從0,0走到m,n的不合法的方法數。仔細想一想為什麼呢?為什麼要找對稱點,在對稱直線一側走的路線總可以在另一側找到路線與之對稱,剛才我們從1,-1走到m,n的那一段
合法路線沿著y=x-1再對稱過去,不合法路線就不用對稱了,因為不合法路線已經與y=x-1相交了(其實那一段合法路線的最後乙個點也與y=x-1相交),這樣就有了從0,0到m,n
的一種方案,總的來說就是對於從1,-1到m,n的每一條路線,都有從0,0到m,n關於y=x-1對稱的一條路線與之對應。從1,-1走到m,n方法數為c (m+n,m-1)。
所以本題的答案就是c(n+m,m) - c (m+n,m-1)。
**:
#include"cstdlib"
#include"cstdio"
#include"cstring"
#include"cmath"
#include"queue"
#include"algorithm"
#include"iostream"
#include"map"
#include"stack"
#define n 2000003
#define eps 1e-8
#define mod 20100501
using namespace std;
#define ll __int64
#define maxn 20000007
bool mark[maxn];
int ss[maxn/3],sscnt,sum[maxn/3];
void ssb()
}return ;
}ll power(ll a,ll b)
return ans;
}ll yzs(ll x,ll y)
return ans;
}int main()
return 0;
}
hdu 1799 DFS求組合數
problem description 我們知道,在程式設計中,我們時常需要考慮到時間複雜度,特別是對於迴圈的部分。例如,如果 中出現 for i 1 i n i op 那麼做了n次op運算,如果 中出現 fori 1 i n i for j i 1 j n j op 那麼做了n n 1 2 次op...
hdu 1220 Cube 組合數學
給你乙個邊長n的正方體,切割成n n n個單位體積的小正方體,求所有公共頂點數 2的小正方體的對數。公共點的數目可能有 0,1,2,4.我們用總的對數減掉有四個公共點的對數就可以了。總的對數 n 3 n 3 1 2 一共有n 3塊小方塊,從中選出2塊 而4個交點的立方體對是兩個立方體共面的情況,所以...
hdu5160 Apple 組合數學
問題描述 現在要給n個小朋友發蘋果,每乙個小朋友都會有自己相應的蘋果數目 cdots a 1 a 2 a 3 a n 發蘋果的時候,小朋友先從左到右隨機站成一排。設站好後從左到右小朋友的標號是 cdots p 1 p 2 p 3 p n 他們所需要的蘋果數目是 cdots a p 1 a p 2 a...