朵花上色,從m
種顏色裡面選擇恰好k
種顏色,求總數mod 1e9
+7種顏色給花上色的話,肯定是k∗(
k−1)
n−1種方案,但是要求的是恰好k
種,很容易想到用容斥原理解決這個問題。 設ai
表示沒選第i
種顏色的種類數目,則結果為
首先有t組資料,每組資料有 3 個數 n, m, k,分別代表一共有 n 個方格,m種顏色,
而我們要 恰好(注意是恰好) 使用 k 中顏色對這些方格進行塗色,
並且保證的是每兩個相鄰的方格的顏色必須是不一樣的。
而我們知道的是 從m中選出k種顏色對n個進行染色的 總數是 s = c(m,k) * k * (k-1)^(n-1)
意思就是說從m個選出k個,然後對於第1個有k種選擇,對於剩餘(n-1)個分別有(k-1)種選擇
需要注意的是 這裡是用k個顏色去染色n,但是不一定全部用上k種顏色
這個時候我們想想怎麼解決恰好只用k種顏色去染色n
容斥原理 ans = s - (a1 + a2 + a3 + ak) ai 表示 不用 i 種顏色,則我們可以使用的顏色有 k-i種
也可以認為 a0 - a1 + a2 - a3 + ... + ak
ai 表示不用i種顏色
最後的表示式為: c(m,k) * ∑ (-1)^(k-i)*c(k,i)*i*(i-1)^(n-1) | (i->[k,0])
*/#includeusing namespace std;
namespace io
templatevoid print(t x)
templatevoid println(t x)
};typedef long long ll;
const ll mod = 1e9+7;
const int maxn = 1e6+10;
/// 注意到公式中只需要計算c(m,k) 和 c(k,i) 而 m,k 都很大,用c(n,m) = n! / m! / (n-m)! 顯然是不合理的
/// 我們可以用遞推的方式 計算 c(m,k) 和 c(k,i);
/// k最大為1e6次方,遞推是合理的 c(n,m) = c(n,m-1) * (n-m+1) / m 顯然m需要用逆元求
ll cm[maxn],ck[maxn];
ll inv[maxn]; /// 我們只需要 1e6次的逆元,提前處理出來
ll power(ll a,ll b)
return ans;
}void get_inv()
}void init(ll m,ll k)
}ll solve(ll n,ll m,ll k)
return ans * cm[k] % mod;
}int main()
return 0;
}
UVALive 7040 color 容斥原理
傳送門 大意 給 n 朵花上色,從 m種顏色裡面選擇恰好 k 種顏色,求總數mod 1e 9 7 首先如果用 k 種顏色給花上色的話,肯定是k k 1 n 1 種方案,但是要求的是恰好 k 種,很容易想到用容斥原理解決這個問題。設a i表示沒選第 i 種顏色的種類數目,則結果為 a 1 a2 ak ...
bzoj 4710(組合數學 容斥原理)
傳送門 題解 先介紹一條公式 將n個物品分給m個人有c n m 1,m 1 種方案。但是這些方案是包括了不合法的 有些人沒有獲得任何物品 對於這道題,需要保證所有人都分到物品,所以容斥原理解決 ans 0個人沒分到 1個人沒分到 2個人沒分到 n個人沒分到 對於某一種情況 i個人沒分到 當前方案數 ...
9 27T1 組合數 容斥原理
1.分特產2414 cut 問題描述 jyy 帶隊參加了若干場acm icpc 比賽,帶回了許多土特產,要分給實驗室的同學們。jyy 想知道,把這些特產分給n 個同學,一共有多少種不同的分法?當然,jyy 不希望任何乙個同學因為沒有拿到特產而感到失落,所以每個同學都必須至少分得乙個特產。例如,jyy...