1 条题解
-
0
前置知识:经典容斥,可以在我的 blog 里了解一下
容斥套容斥。
我们考虑一个一个地通过容斥把这些条件去掉,先令元素是所有染色方案,第 个颜色的出现次数是 ,条件集合是 套用容斥模型消掉最后一个条件,注意到这些颜色的地位是等价的,我们枚举条件集合大小化简式子,答案就是
$$\begin{aligned} &\sum_{S\subseteq U}(-1)^{|S|}f(S)\\ =&\sum_{i=0}^c\binom{c}{i}(-1)^{|S|}s(c-i)\\ \end{aligned}$$其中 是只用 种颜色不考虑第颜色条件的涂色方案数。
接下来再容斥掉行列限制,若第 行全不染那么 ,令条件集合是 ,每一行的地位也是等价的,我们得到
$$\begin{aligned} s(c)=&\sum_{S\subseteq U}(-1)^{|S|}f(S)\\ =&\sum_{i=0}^n\binom{n}{i}(-1)^is'(c,n-i)\\ \end{aligned}$$其中 是只用 种颜色,假设地图只有 行后不考虑行和颜色条件的涂色方案数,只需考虑不允许有空列,剩下随便填,显然就是
(考虑先填出一列合法的,然后再拼出 列)
时间复杂度 。
# include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e5 + 225; const ll Mod = 1e9 + 7; int n , m , c; ll Pow( ll x , ll y ){ ll res = 1; while( y ){ if( y & 1 ) res = res * x % Mod; x = x * x % Mod , y >>= 1; } return res; } ll f[ N ] , invf[ N ] , g[ N ]; ll Binom( int p , int q ){ return f[ p ] * invf[ q ] % Mod * invf[ p - q ] % Mod; } ll G( int p , int q ){ return Pow( ( Pow( p + 1 , q ) - 1 + Mod ) % Mod , m ); } ll F( int p ){ ll res = 0; for( int i = 0 ; i <= n ; i ++ ) res = ( res + ( ( i & 1 ) ? Mod - 1 : 1 ) * Binom( n , i ) % Mod * G( p , n - i ) % Mod ) % Mod; return res; } int main(){ scanf( "%d%d%d" , & n , & m , & c ); f[ 0 ] = invf[ 0 ] = 1; int wq = max( max( n , m ) , c ); for( int i = 1 ; i <= wq ; i ++ ) f[ i ] = f[ i - 1 ] * i % Mod; invf[ wq ] = Pow( f[ wq ] , Mod - 2 ); for( int i = wq - 1 ; i >= 1 ; i -- ) invf[ i ] = invf[ i + 1 ] * ( i + 1 ) % Mod; ll ans = 0; for( int i = 0 ; i <= c ; i ++ ) ans = ( ans + ( ( i & 1 ) ? Mod - 1 : 1 ) * Binom( c , i ) % Mod * F( c - i ) ) % Mod; printf( "%lld\n" , ans ); return 0; }
- 1
信息
- ID
- 6152
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者