点此看题面

大致题意: 有一个\(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. 初始 D2 Admin

    1.安装D2 admin 输入:npm install -g @d2-admin/d2-admin-cli 2.创建D2 项目 ,可以选择简洁版或者完整版 输入:d2 create 3.然后 进入创建 ...

  2. 服务器运行两个或两个以上的tomcat

    一:解决方法 转载: https://www.cnblogs.com/xiaobai1226/p/7662392.html 二:解决方法 将tocmat下  bin---->tomcat8w.e ...

  3. 事务背书 ACID, CAP, BASE

    A atomicity 原子性 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成, C consistency 一致性 在事务开始之前和事务结束以后,数据库的完整性没有被破 ...

  4. my25_Mysql操作技巧汇总

    1. drop database 在数据量很大的情况下,最好先对表进行truncate,然后再drop database:不然会卡住很长的时间. 2. 数据的逻辑导入导出 如果数据量大,又需要进行逻辑 ...

  5. java——ArrayList 的存在有什么意义?

    好像所有的数据类型都可以用比如 TreeMap[]  int[] Object[] 这种形式来创建自己的数组,那么ArrayList存在的意义是什么呢? 我只能想到这种:ArrayList可以存储多种 ...

  6. Python数据可视化--matplotlib

    抽象化|具体化: 如盒形图 | 现实中的图 功能性|装饰性:没有装饰和渲染 | 包含艺术性美学上的装饰 深度表达|浅度表达:深入层次的研究探索数据 | 易于理解的,直观的表示 多维度|单一维度:数据的 ...

  7. Android Studio CMake 生成多个so

    生成多个so案例 这里stringFromJNI和stringFromJNI11分别是调用one-lib和two-lib两个so package com.test.ndkmoreso; import ...

  8. Idea创建Maven项目没有src

    第一次创建,下载非常慢,解决方法 1.配置环境变量 第二种:创建Maven项目时加上 archetypeCatalog=internal 参数 第三种:为自己的Maven配置国内镜像源 打开自己的 M ...

  9. Java基础05-运算符

    1.赋值运算符:= 2.算术运算符: (1)一元运算符: i++;先使用后自身加1  int i=1;int b=i+1; b=1  i=2 ++i;先对自身加1后使用 int j=1;int b=+ ...

  10. org.apache.subversion.javahl.ClientException: Working copy is not up-to-date

    之前因为将项目中的一个文件删除了,然后添加了新的文件,svn提交的时候报错. 提示:Working copy is not up-to-date 解决办法:对应的项目上右键然后选择team,然后选择u ...