SCOI2010 生成字串

2022-05-09 12:45:26 字數 692 閱讀 7757

題目大意:給出n個『1』,m個『0』,求用這些組成的串中,滿足「前k個字元中1數不小於0數」的串的個數。(對20100403取模)

同學互測題出了原題,當時蒙蔽。除了一眼看出的dp:dp[ i ][ j ] = dp[ i-1 ][ j ] + dp[ i ][ j-1 ];

然後就是持續蒙蔽。。。

最後同學講題,講了乙個非常nb的構造演算法:

將串想象成乙個巨大的**中的一條折線,其中1代表45度向上,0代表45度向下。

要控制1>=0,只需要控制這條線保持在第一象限。

怎麼計算不合法情況呢?我們只需要將折線的一部分對稱下來,形成一條從( -2 , 0 )到終點的折線,此時有對映。

(下面是結論:)

ans = c( n , n+m ) - c( n+1 , n+m);

**:

#include#include

using

namespace

std;

#define mod 20100403

#define ll long long

#define n 1000050ll n,m;

ll ny[n

<<1],jc[n<<1],jny[n<<1

];void

init()

}ll c(ll a,ll b)

intmain()

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

SCOI2010 生成字串

給定n,m,求乙個包含n個1,m個0,且任何字首的1的數量必須大於0的數量的合法01串的數量,答案對20100403取模。我們建立座標系,定義x座標為1和0的數量的和,y座標表示1和0的數量的差,那麼向右上走就表示選擇1,向右下走就表示選擇0。如果不考慮限制條件,那麼我們要從 0,0 走到 n m,...