洛谷P4931 情侶?給我燒了!(加強版)(容斥)

2021-09-26 02:00:17 字數 1829 閱讀 7431

傳送門

我們接著這篇題解的思路考慮。

g n,

0g_

gn,0

​到底想表達什麼?

貌似指的是n

nn個人沒有一對情侶坐在一起的方案數。

e mm

mm

emmmm

emmm

m,那不就是把兩個人綁在一起拿來錯排嗎?

於是我們顯然可以o(n

)o(n)

o(n)

預處理這個g

gg陣列了。

先不考慮順序,每次新增一對情侶,只有乙個跟前面的人換,另乙個不動⇒gi

=(2n

−2)(

gi−1

+gi−

2)

\rightarrow g_=(2n-2)(g_+g_)

⇒gi​=(

2n−2

)(gi

−1​+

gi−2

​)處理完之後對於每一種情況都需要給左側的人標號以及左右的人可以互換⇒gi

∗=i!

2i

\rightarrow g_*=i!2^i

⇒gi​∗=

i!2i

搞完了。

**:

#include

#define ri register int

using

namespace std;

const

int rlen=

1<<18|

1;inline

chargc(

)inline

intread()

const

int mod=

998244353

;typedef

long

long ll;

inline

intadd

(int a,

int b)

inline

intdec

(int a,

int b)

inline

intmul

(int a,

int b)

inline

void

add(

int&a,

int b)

inline

void

dec(

int&a,

int b)

inline

void

mul(

int&a,

int b)

inline

intksm

(int a,

int p)

const

int n=

5e6+5;

int n,fac[n]

,ifac[n]

,pw[n]

,f[n]

;inline

intc

(int n,

int m)

intmain()

for(ri i=

2,up=

5e6;i<=up;

++i)pw[i]

=add

(pw[i-1]

,pw[i-1]

),mul(ifac[i]

,ifac[i-1]

),mul(f[i]

,mul

(pw[i]

,fac[i]))

;for

(ri k,tt=

read()

;tt;

--tt)

return0;

}

luogu P4931 情侶?給我燒了!

雙倍經驗 傳送門首先坐在一起的cp和不坐在一起的cp是相對獨立的,可以分開考慮,然後方案數相乘 坐在一起的cp,方案為 binom binom k 2 k 首先選出k排座位,然後選出k對cp坐下,然後這k對可以任意打亂順序,並且每一對可以換座位 不坐在一起的cp,一開始以為就是個錯排,然後錯排其實是...

P4921 情侶?給我燒了!

加強前這道題還是比較友好的 首先我們設 g x 為x對情侶沒有一對坐在一起的數量 然後答案就可以表示成 c n k a n k 2 k g 這裡的複雜度是 o t n 貌似不錯,所以現在問題變成求 p x 了 第一篇題解是利用這是乙個錯牌問題,用遞推式解決,複雜度為優秀的 o n 但是由於詢問的複雜...

洛谷P2194HXY燒情侶

傳送門啦 這個題可以說是tarjan強連通分量的裸題,但需要維護每個強連通分量的最小值,所以做法就很明確了。我們先明確幾個陣列的意思 1.首先是tarjan縮點中的幾個陣列 dfn i i點的時間戳 low i 表示這個點以及其子孫節點連的所有點中dfn最小的值 stack,表示當前所有可能能構成是...