SCOI2010 生成字串

2022-08-13 15:24:11 字數 1178 閱讀 7987

lxhgww最近接到了乙個生成字串的任務,任務需要他把n個1和m個0組成字串,但是任務還要求在組成的字串中,在任意的前k個字元中,1的個數不能少於0的個數。現在lxhgww想要知道滿足要求的字串共有多少個,聰明的程式設計師們,你們能幫助他嗎?

輸入資料是一行,包括2個數字n和m

輸出資料是一行,包括1個數字,表示滿足要求的字串數目,這個數可能會很大,只需輸出這個數除以20100403的餘數

2 2

limitation

每點2秒

對於30%的資料,保證1<=m<=n<=1000

對於100%的資料,保證1<=m<=n<=1000000

一眼組合數

然後想到像catalan數那樣把\(0/1\)轉化到座標系中

然後就越走越偏==

正解是類似catalan數的推導公式的東西

選1就是\((x,y) -> (x+1,y+1)\)

選0就是\((x,y) -> (x+1,y-1)\)

所以構成\(0/1\)字串的方案數就是\(c(n+m,m)\)

然後有乙個條件就是任何時候1的數量都不小於0的數量

所以答案就是從\((0,0)\)出發不碰到\(y=-1\)的路徑

考慮怎麼去掉碰到\(y=-1\)的路徑

我們可以把從\((0,0)\)碰到\(y=-1\)的直線對稱下來

就是從\((0,-2)\)走\(n+m\)步走到\((n,n-m)\)的方案數

所以答案就是走\(n+m+1\)步1,走\(m-1\)步0

#include#include# define int long long

const int m = 2000005 ;

const int mod = 20100403 ;

using namespace std ;

int n , m ;

int fac[m] , ans ;

inline int fpw(int base , int k)

return temp ;

}inline int c(int n , int m)

# undef int

int 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 我...