清華2019冬令營模擬12 15 排列

2021-09-03 03:06:33 字數 1543 閱讀 5298

考慮對乙個值i它的區間的長度是多少。

區間可以只考慮右半部分的,左邊的倒過來做一遍就行了。

若i是固定的,找到右邊第乙個固定的j>i

那麼區間肯定不能超過j所在的位置。

可以直接列舉區間的右端點,這個右端點選的大於i,它左邊的小於i,剩餘的亂排,用排列數算即可。

這一部分o(n

2)o(n^2)

o(n2)

若i不是固定的,找到整個序列固定的大於i的,它們把整個序列分成若干段,對於每一段分開做。

考慮列舉相鄰j,k(js[x

]=s[

x−1]

∗p(l

,x)∗

(s−x

−1)!

s[x]=s[x-1]*p(l,x)*(s-x-1)!

s[x]=s

[x−1

]∗p(

l,x)

∗(s−

x−1)

!l表示小於i的不定的個數 ,s表示總不定的個數,這樣就對一組(j,k)就可以快速查詢了。

code:

#include

#include

#define ll long long

#define fo(i, x, y) for(int i = x; i <= y; i ++)

#define fd(i, x, y) for(int i = x; i >= y; i --)

using namespace std;

const

int mo =

998244353

;ll ksm

(ll x, ll y)

const

int n =

5005

;ll fac[n]

, nf[n]

;int n, a[n]

;ll ans, s[n]

;int s, l, bz[n]

, d[n]

, d0, p[n]

, p0;

voidgg(

)if(!a[j]

) d[

++ d0]

= j;

} ans +

= fac[s]

*(d[1]

- bz[i]

)% mo;

fo(j,

1, d0 -1)

if(l - j >=

0&& s - j >=0)

ans +

= fac[l]

* nf[l - j]

% mo * fac[s - j]

% mo *

(d[j +1]

- d[j]

)% mo;

ans %

= mo;

}else

l ++;}

}}intmain()

清華2019冬令營模擬12 8 視野

計算幾何弱渣果然就是一點感覺也沒有。首先考慮不刪怎麼做?肯定要把點給離散,那麼現在對於每一小段,要求出是哪條線段最近?按乙個順序掃過去,每一條線段打乙個加入和刪除的標記。由於線段互不相交,所以線段順序不會隨著小段的移動而改變。因此,我們可以用乙個set去維護插入刪除,比較遠近時,就求交,判斷誰近。那...

2019徐州冬令營

day1 長短 模擬 資料提取碼 1t2n 題目鏈結 day2 生成排列 資料提取碼 z6e7 題目鏈結 排列組合計數的實驗範例 catalan數 bell數 stirling數 day3 鴿巢原理 資料提取碼 k6b9 題目鏈結 容斥原理 p lya計數公式 群和p lya定理基礎知識 day4 ...

5507 清華冬令營2018模擬 取石子

直接說做法了,挺好理解的。欽定a b a le b a b。設r x mod a b r x mod a b r xmod a b 分四種情況討論 r 0,a 1 r in 0,a 1 r 0,a 1 這個情況沒有意義。r a,b 1 r in a,b 1 r a,b 1 這個情況下,a aa能多走...