給定n,m,求乙個包含n個1,m個0,且任何字首的1的數量必須大於0的數量的合法01串的數量,答案對20100403取模。
我們建立座標系,定義x座標為1和0的數量的和,y座標表示1和0的數量的差,那麼向右上走就表示選擇1,向右下走就表示選擇0。
如果不考慮限制條件,那麼我們要從(0,0)走到(n+m,n-m),就相當於從n+m步中選出m步向右下走,方案數就是$c_^m$
現在考慮限制條件:任何字首的1的數量必須大於0的數量,那麼就意味著我們的在座標系中的路徑不能經過直線y=-1,那麼非法的方案就是從(0,0)走到(x,-1)再走到(n+m,n-m),這就等價於從(0,-2)開始走到(n+m,n-m),即方案數為$c_^$,那麼合法方案數就是這兩個方案數之差。
我們首先預處理出乙個階乘陣列和乙個階乘的逆元陣列,逆元可以通過費馬小定理或者是線性遞推實現。
然後套用組合數的公式即可完成。
1 #include 2ac codeusing
namespace
std;
3 typedef long
long
ll;4 ll n, m, fac[2000010], inv[2000010];5
const ll mod = 20100403;6
inline ll qpow(ll a, ll n)
13return
ret;14}
15inline ll c(ll n, ll m)
18int
main()
SCOI2010 生成字串
題目大意 給出n個 1 m個 0 求用這些組成的串中,滿足 前k個字元中1數不小於0數 的串的個數。對20100403取模 同學互測題出了原題,當時蒙蔽。除了一眼看出的dp dp i j dp i 1 j dp i j 1 然後就是持續蒙蔽。最後同學講題,講了乙個非常nb的構造演算法 將串想象成乙個...
SCOI2010 生成字串
oj題號 bzoj1856 洛谷1641 思路 總方案數為 binom 非法方案數為 binom 則合法方案數為 n m 1 frac 其中除以 m 可以用乘以逆元實現,邊乘邊模。因為要求出1 m的連續的逆元,所以可以線性推。另外注意中間結果和最終乘積可能會超過int範圍,所以要轉long long...
SCOI2010 生成字串
乙個廣為流傳的 trick 然而我現在才學會。題面題解在任意的前k個字元中,1的個數必須大於等於0的個數。我們把放乙個 1 視為向右走一步,放乙個 0 視為向上走一步,現在答案就轉換為從 0,0 開始,走到 n,m 並且不能跨越 y x 有多少種方案數。對於不合法的方案數 如果經過了 y x 1 我...