考慮對乙個值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能多走...