2017百度之星資格賽 1005 尋找母串

2021-08-05 20:23:57 字數 1344 閱讀 6677

題意:

對於乙個串s,當它同時滿足如下條件時,它就是乙個01偏串: 1、只由0和1兩種符組成; 2、在s的每乙個字首中,0的個數不超過1的個數; 3、s中0的個數和1的個數相等。

現在給定01偏串s,請計算一下s在所有長度為n的01偏串中作為子串出現的次數的總和。 由於結果比較大,結果對1e9+7取餘後輸出。 n≤

109,|

s|≤10

5 解法:

我們列舉s所在的原串位置,再列舉剩下的位置填什麼。

通過這個思路,我們可以得出答案為 (n

−|s|

+1)c

atal

an(n

−|s|

2)其中catalan數為 ca

tala

n(n)

=cn2

n−cn

−12n

採取分段打表的做法來求組合數

根據組合數公式,我們需要求出10^9級別的階乘

設定閾值

k ,分別將0!

,k! ,(2

k)! ……(x

k)! 打表打出來 對於t

! ,先查表求出(⌊

tk⌋k

)!,在將剩下的暴力乘上去,單次求階乘的複雜度為o(

k)打表的內容複雜度為o(

nk) ,由於**長度限制,這裡的k需要滿足k≥

2∗105

由於**過長,略去了打表的部分

#include 

#define n 1000500

#define k 200000

#define mod 1000000007

using

namespace

std;

typedef

long

long ll;

int n,m;

char s[n];

inline

int rd()

while (ch>='0'&&ch<='9')

return x*f;

}const

int sqrjc = ;

ll fac(int l,int r)

inline ll qp(ll a, ll b)

return ret;

}inline ll j(int x)

inline ll c(ll a, ll b)

inline ll catalan(int x)

void solve()

int main()

百度之星資格賽

1001 給你1 n這n個數字,公升序排列,接下來按照陣列a進行位置變換,a i 代表第i個數字會變到a i 位置上,a中的數字也是從1 n。現在問有多少個不同的陣列能滿足做一次變換和做三次變換結果相同。我們可以這樣分析,x y是唯一的到y的途徑,假設x y為第一次變換,因此在第三次變換的時候任然為...

2017 百度之星 程式設計大賽 資格賽

度度熊為了拯救可愛的公主,於是與 大魔王戰鬥起來。大魔王的麾下有n個怪獸,每個怪獸有a i 的生命值,以及b i 的防禦力。度度熊一共擁有m種攻擊方式,第i種攻擊方式,需要消耗k i 的晶石,造成p i 點傷害。當然,如果度度熊使用第i個技能打在第j個怪獸上面的話,會使得第j個怪獸的生命值減少p i...

2017 百度之星 程式設計大賽 資格賽

思路 比賽的時候也一直以為是計算幾何問題,所以就沒想,賽後看了看大佬們的部落格發現思路還是挺簡單的,就是對度度熊夥伴進行建圖,有邊的條件是所有所有村莊位於這天邊的一側,然後對這個圖跑乙個最小環 之前一直不理解叉積,做了幾道題之後好多了 include include include include ...