点此看题面

大致题意: 有一个\(n*m\)的矩形,先让你用\(C\)种颜色给它染色。每个格子可染色可不染色,但要求每行每列至少有一个小方格被染色,且每种颜色至少出现一次。求方案数。

高维容斥

显然题目中给你\(3\)个条件,而我们要一起容斥,所以就是高维容斥。。。

通过高维容斥,我们可以得到这样一个式子:

\[\sum_{i=0}^n(-1)^{n-i}C_n^i\sum_{j=0}^m(-1)^{m-j}C_m^j\sum_{k=0}^c(-1)^{c-k}C_c^k(k+1)^{ij}
\]

然后我们把三个\(\sum\)提前,就可以得到这样一个式子:

\[\sum_{i=0}^n\sum_{j=0}^m\sum_{k=0}^c(-1)^{n+m+c-i-j-k}C_n^iC_m^jC_c^k(k+1)^{ij}
\]

可以发现,这个式子可以\(O(nmc)\)推,做这题\(n,m,c\le400\)的数据已经足够了。

二项式定理

虽说原先的式子已经能水过了,但这题其实可以优化至\(O(nclog_2m)\)。

首先我们要知道二项式定理是这样一个式子:

\[(x+y)^n=\sum_{i=0}^nC_n^ix^iy^{n-i}
\]

然后我们就要考虑将上面的式子转化,使其能够用二项式定理化简:

\[\sum_{i=0}^n\sum_{k=0}^c((-1)^{n+m+c-i-k}C_n^iC_c^k\sum_{j=0}^mC_m^j(-1)^{-j}((k+1)^i)^j)
\]

接下来我们单独考虑其中\(\sum_{j=0}^mC_m^j(-1)^{-j}((k+1)^i)^j\)。

观察可得,这个式子中枚举上界为\(m\),有一个组合数\(C_m^j\),且\(((k+1)^i)^j\)一项为\(j\)次项,因此我们要把另一项变成\((m-j)\)次项。

也就是我们要乘上一个\((-1)^m\)。

于是就能得到这样一个式子:

\[(-1)^{-m}\sum_{j=0}^mC_m^j(-1)^{m-j}((k+1)^i)^j
\]

\[(-1)^{-m}(-1+(k+1)^i)^m
\]

考虑当\(m\)为奇数时,\((-1)^{-m}=-1\),可得:

\[(1-(k+1)^i)^m
\]

考虑当\(m\)为偶数时,\((-1)^{-m}=-1\),考虑到一个数与其相反数的偶次幂相等,可得:

\[(1-(k+1)^i)^m
\]

因此,原始可以简单地归纳为一个式子。

再把这个式子代回整个式子中,就得到:

\[\sum_{i=0}^n\sum_{k=0}^c((-1)^{n+m+c-i-k}C_n^iC_c^k(1-(k+1)^i)^m
\]

而这个式子就可以\(O(nclog_2m)\)求解了。

代码

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 400
#define X 1000000007
#define Qinv(x) Qpow(x,X-2)
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
#define Dec(x,y) ((x-=(y))<0&&(x+=X))
#define C(x,y) (1LL*Fac[x]*Inv[y]%X*Inv[(x)-(y)]%X)
#define swap(x,y) (x^=y^=x^=y)
using namespace std;
int n,m,c,Fac[N+5],Inv[N+5];
I int Qpow(RI x,RI y) {RI t=1;W(y) y&1&&(t=1LL*t*x%X),x=1LL*x*x%X,y>>=1;return t;}//快速幂
I int XSub(RI x,CI y) {return Dec(x,y),x;}//模意义下做减法
int main()
{
RI i,k,t,ans=0;for(scanf("%d%d%d",&n,&m,&c),t=max(n,c),Fac[0]=i=1;i<=t;++i) Fac[i]=1LL*Fac[i-1]*i%X;//初始化阶乘
for(Inv[t]=Qinv(Fac[t]),i=t-1;~i;--i) Inv[i]=1LL*Inv[i+1]*(i+1)%X;//初始化阶乘逆元
for(i=0;i<=n;++i) for(k=0;k<=c;++k)//枚举i和k,求解答案
{
if((n+m+c-i-k)&1) Dec(ans,1LL*C(n,i)*C(c,k)%X*Qpow(XSub(1,Qpow(k+1,i)),m)%X);
else Inc(ans,1LL*C(n,i)*C(c,k)%X*Qpow(XSub(1,Qpow(k+1,i)),m)%X);
}
return printf("%d",ans),0;//输出答案
}

【BZOJ4487】[JSOI2015] 染色问题(高维容斥)的更多相关文章

  1. 【BZOJ4487】[JSOI2015]染色问题(容斥)

    [BZOJ4487][JSOI2015]染色问题(容斥) 题面 BZOJ 题解 看起来是一个比较显然的题目? 首先枚举一下至少有多少种颜色没有被用到过,然后考虑用至多\(k\)种颜色染色的方案数. 那 ...

  2. BZOJ4487 [Jsoi2015]染色问题

    BZOJ4487 [Jsoi2015]染色问题 题目描述 传送门 题目分析 发现三个限制,大力容斥推出式子是\(\sum_{i=0}^{N}\sum_{j=0}^{M}\sum_{k=0}^{C}(- ...

  3. bzoj4487[Jsoi2015]染色问题 容斥+组合

    4487: [Jsoi2015]染色问题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 211  Solved: 127[Submit][Status ...

  4. [bzoj4487][Jsoi2015]染色_容斥原理

    染色 bzoj-4487 Jsoi-2015 题目大意:给你一个n*m的方格图,在格子上染色.有c中颜色可以选择,也可以选择不染.求满足条件的方案数,使得:每一行每一列都至少有一个格子被染色,且所有的 ...

  5. 2019.02.09 bzoj4487: [Jsoi2015]染色问题(容斥原理)

    传送门 题意简述: 用ccc中颜色给一个n∗mn*mn∗m的方格染色,每个格子可涂可不涂,问最后每行每列都涂过色且ccc中颜色都出现过的方案数. 思路: 令fi,j,kf_{i,j,k}fi,j,k​ ...

  6. BZOJ4487 JSOI2015染色问题(组合数学+容斥原理)

    逐个去除限制.第四个限制显然可以容斥,即染恰好c种颜色的方案数=染至多c种颜色的方案数-染至多c-1种颜色的方案数+染至多c-2种颜色的方案数…… 然后是限制二.同样可以容斥,即恰好选n行的方案数=至 ...

  7. BZOJ5306 [HAOI2018]染色 【组合数 + 容斥 + NTT】

    题目 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 \(M\) 种颜色中的某一种. 然而小 C 只 ...

  8. [BZOJ4487][JSOI2015]染色问题(容斥)

    一开始写了7个DP方程,然后意识到这种DP应该都会有一个通式. 三个条件:有色行数为n,有色列数为m,颜色数p,三维容斥原理仍然成立. 于是就是求:$\sum_{i=0}^{n}\sum_{j=0}^ ...

  9. LOJ2542 PKUWC2018 随机游走 min-max容斥、树上高斯消元、高维前缀和、期望

    传送门 那么除了D1T3,PKUWC2018就更完了(斗地主这种全场0分的题怎么会做啊) 发现我们要求的是所有点中到达时间的最大值的期望,\(n\)又很小,考虑min-max容斥 那么我们要求从\(x ...

随机推荐

  1. 6.过滤器(Filter)

    ---恢复内容开始--- 1.过滤器简介: 过滤器是一个用于拦截在数据源和数据目的地之间消息的一个对象. 过滤器 功能: 分析请求,将请求发送给指定的资源或自己创建一个响应返回:在请求到达服务器端前处 ...

  2. my02_Atlas mysql5.7安装配置

    软件环境:centos7.3,glib-2.49,lua5.1,Atlas2.2.1,mysql5.7 依赖包安装******************************************* ...

  3. py---------面向对象基础篇

    引子 你现在是一家游戏公司的开发人员,现在你需要开发一款叫做<人猫大战>的小游戏,你就思考呀,人猫大战,那至少需要两个角色,一个是人,一个是猫,且人和猫有不同的技能,比如人拿棍打狗,狗可以 ...

  4. 性能测试工具LoadRunner28-LR之内部数据参数类型

    Date/Time 在“Parameter type”中您可以选择Date/Time,即:用当前的日期/时间替换参数.要指定日期/时间的格式,可以从格式列表中选择一个格式,或者指定您自己的格式. [l ...

  5. android 中百度地图 关于地图缩放所调用的事件

    在做百度地图的时候 javascript 有个地图缩放的事件 但是在android 的API里面却没有,但是还好  官方给了一个MapStatusChangeListener,是这样介绍的 百度地图S ...

  6. Kudu compaction design

    不多说,直接上干货! http://blog.csdn.net/lookqlp/article/details/51438109

  7. mac os安装macvim

    1 brew install macvim 安装 macvim 2 alias vim='/usr/local/Cellar/macvim/7.4-73_1/MacVim.app/Contents/M ...

  8. [PHP]生成随机数(建立字典)

    代码如下 : //建立有76个字符组成的字典 $pattern='1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM!@#$% ...

  9. C语言实现通用链表初步(三)----单元测试

    前两节,我们已经完成了链表的一些操作,快来测试一下吧. 这里使用的单元测试工具名字叫"check". START_TEST(my_slist_1) { struct student ...

  10. HDU 4334——Trouble——————【贪心&水题】

    Trouble Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...