同桌與室友 計數類問題

2022-06-10 23:39:12 字數 1820 閱讀 8064

題意:

題目描述:

\(x\)班有 n 個人,從\(1\)到\(n\)編號。他們中有一些人住雙人宿舍,一些人住單間,也

就是說一些人有唯一的乙個室友,有些人則沒有。同時有些人會和他的同桌共用一張雙

人桌,另一些人則單獨坐。

你需要求出有多少個排列\(p\),滿足原本的人\(i\)換到\(p_i\)的宿舍以及桌子上後,原本

的室友以及同桌關係依舊不變,答案對\(10^9 + 7\)取模。

輸入格式

第一行三個整數\(n,m1,m2\),表示人數,雙人宿舍數量,雙人桌數量。

接下來\(m1\)行,每行兩個整數\(x,y\),表示\(x\)和\(y\)同住一間雙人宿舍。

接下來\(m2\)行,每行兩個整數\(x,y\),表示\(x\)和\(y\)同用一張雙人桌。

輸出格式

輸出一行乙個整數,表示滿足條件的排列數量。

樣例 1 輸入

7 2 2

1 23 4

1 45 6

樣例 1 輸出

4樣例 2 輸入

5 2 1

1 23 4

1 42

樣例 2 輸出

2資料範圍與約定

對於\(5\)%的資料,\(1 ≤ n ≤ 1\);

對於 \(20\)% 的資料,\(1 ≤ n ≤ 10\);

對於額外\(15\)% 的資料,乙個人要麼住單人間,要麼就用單人桌;

對於額外 \(15\)% 的資料, 保證 \(n\) 是偶數,\(m1 = m2 =n/2\)

對於額外 \(20\)% 的資料, 保證資料完全隨機生成;

對於\(100\)% 的資料,保證 \(1 ≤ n ≤ 2 × 10^5,m1, m2 ≤n/2\)

一句話版:一張圖有黑白兩種邊,求使得圖同構的置換數

思路:將雙人宿舍關係看做是黑邊,雙人桌關係看做是白邊,那麼就是乙個圖同構的計數

考試時一看是圖同構,打了個暴力就跑

其實這道題的圖有特殊之處

每個點度數最多為2(白邊黑邊各一條)

因此每乙個連通塊要麼是乙個簡單環,要麼是一條鏈

分類計數即可。

具體來說,

如果有 \(x\) 個大小為 \(i\) 的環,那麼這一部分答案為 \(x! × i^x\);

如果有 \(x\) 個長度相同,兩段邊同為黑或同為白的鏈,那麼這一部分答案為 \(x! × 2^x\);

如果有 \(x\) 個長度相同,兩段邊不同色的鏈,那麼這一部分答案為 \(x!\);

注意事項:

做一道題最好能把題意極為簡潔地概括出來,方便分析

牢牢抓住一道題的特殊點

code:

#includeusing namespace std;

const int n=2e5+5;

const int p=1e9+7;

int n,m1,m2,rg,cnt,cl,ans=1;

int to[n][2],r[n],l[n][2];

bool vis[n];

inline int read()

void dfs(int u,int tp)

if(!to[u][tp^1])

if(vis[to[u][tp^1]]) return;

dfs(to[u][tp^1],tp^1);

}int main()

for(int i=1;i<=m2;++i)

for(int i=1;i<=n;++i)

else

else

}} printf("%d\n",ans);

return 0;

}

計數與排序問題

2011 04 09 wcdj 問題描述 將n 1 n 200000 個整數從小到大連續編號,相同的數應具有相同的編號。並按這n個數輸入時的順序輸出它們的編號序列。例如,設輸入資料為 5 3 4 7 3 5 6,則輸出資料為3 1 2 5 1 3 4。輸入形式 從標準輸入讀取資料。輸入包含n個數字 ...

分類計數原理與分步計數原理 計數問題之容斥原理

今天來聊聊計數問題中的容斥原理。我們知道加乘原理,加乘 中的 加 其實是分類思想的體現,這種分類是基於乙個前提,就是你的是你的,我的是我的,每個分類都分的清清楚楚,彼此無交叉。而今天要聊的容斥原理與此不同,容斥是你中有我,我中又有你。容指包含 斥指排除,大概是這個意思吧!容斥的問題可以利用文氏圖 又...

計數類問題中的取模運算總結

本篇隨筆簡單講解一下資訊學奧林匹克競賽中計數類問題中的取模運算相關知識。算是一篇總結性質的部落格,將會簡單介紹在計數類問題進行答案統計的時候如何對算式進行合法的取模。如果是形如 a b mod p 的式子,可以變成 a mod p b mod p 因為減法是加法的一種相反數運算,所以減法的取模運算也...