bzoj1856 字串 組合數學

2021-07-09 06:56:55 字數 892 閱讀 3565

果然是神題。。。數形結合。。。

看到這道題,第一反應是把0看成-1,這樣就變成字首和》0了。其實也想到了把這個字串轉化成1條折線,即從(0,0)出發,經過n+m步,每一步不是向右上走一格就是向右下走一格,要求不能到x軸的下方,求到達點(n+m,n-m),但是接下來的就比較巧妙了,確實想不到。(也可以見=>

首先求出總方案c(n+m,n),如果一條線不合法,那麼它一定是走到x軸下方了。那麼可以想到,它一定經過直線y=-1。如果將這條直線第一次與y=-1相交的點的前半部分以直線y=-1為對稱軸翻摺,則這條直線的起點變為(0,-2),而這條直線就相當於從點(0,-2)到(n+m,n-m)的一條直線了。顯然,從(0,-2)->(n+m,n-m)的直線與不合法的直線是一一對應的。而從(0,-2)->(n+m,n-m)的直線必然有n+1次向右上走,m-1次向右下走。因此,在本題中不合法字串的總數就相當於:有n+1個1,m-1個0的字串總數(不管合法不合法),這個值等於c(n+1+m-1,n+1)=c(n+m,n+1)。

因此,本題的答案為c(n+m,n)-c(n+m,n+1)。注意到取模的數p=20100403為質數,因此由費馬小定理,x^(p-1)≡1(mod p)得x^(-1)

≡x^(p-2)(mod p)。

ac**如下:

#include#include#define ll long long

#define mod 20100403

using namespace std;

ll n,m;

ll ksm(ll x,ll y)

return sum;

}ll fac(ll x)

ll cbn(ll x,ll y)

int main()

by lych

2016.1.3

csp模擬 字串問題 計數 組合數學

傳送門 又是乙個計數題,在n個數中間填加號,求所有方案的數字和。下面提供兩種解法,題解的和來自fsy的。題解 考慮每個區間對數的貢獻,要麼沒有貢獻,要麼貢獻是10的冪。故我們可以列舉使得這個數的係數為10 i時,區間的個數。發現是個組合數。發現這樣列舉實際上是固定了該點所在區間的右端點,也就是說固定...

面試經典(22) 字串組合

題目 輸入乙個字串,輸出該字串中字元的所有組合。舉個例子,如果輸入abc,它的組合有a b c ab ac bc abc。假設我們想在長度為 n的字串中求 m個字元的組合。我們先從頭掃瞄字串的第乙個字元。針對第乙個字元,我們有兩種選擇 一是把這個字元放到組合中去,接下來我們需要在剩下的 n 1個字元...

KMP 字串 BZOJ4974字串大師

在kmp演算法中,fai lfail fail 指標有乙個特殊的性質,i f aili i fail i i fail i 是前i個字元的最小迴圈節大小。所以這題相當於就是說,給了你每個點的fail指標,求乙個滿足的字串。那麼按照建fail指標的方式倒過來做就好了 include include i...