51Nod1634 刚体图 动态规划 容斥原理 排列组合
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1634.html
题目传送门 - 51Nod1634
题意


例如,对于 2 × 3 的格点图,一共有 448 种方案。
题解
考虑到加一条斜着的边的作用是让一个格子的行和列垂直。
我们需要让所有的行和列都互相垂直。于是,只要我们建一个二分图,行和列分居两侧,问题就被转化成了统计连通的二分图个数,其中,一条边有两种连接的方式。
令 $dp_{i,j}$ 表示左边有 $i$ 个,右边有 $j$ 个节点 的连通二分图个数,于是我们需要补集转化一下,得到:
$$dp_{n,m}=3^{nm}-\sum_{i=1}^{n}\sum_{j=0}^{m}[i\neq n\ {\rm OR}\ j\neq m] \binom{n-1}{i-1}\binom{m}{j}\cdot 3^{(n-i)(m-j)}dp_{i,j}$$
这里略微的解释一下意义。我们枚举第一个节点所在的连通块的左右部分点的个数,然后剩余的边可以随意连,所以有一个 $3^{(n-i)(m-j)}$ 。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=15,mod=1e9+7;
int C[N][N],Pow3[N*N],dp[N][N];
int main(){
for (int i=0;i<N;i++)
C[i][0]=C[i][i]=1;
for (int i=1;i<N;i++)
for (int j=1;j<i;j++)
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
Pow3[0]=1;
for (int i=1;i<N*N;i++)
Pow3[i]=3LL*Pow3[i-1]%mod;
memset(dp,0,sizeof dp);
dp[0][1]=dp[1][0]=1;
for (int n=1;n<N;n++)
for (int m=1;m<N;m++){
dp[n][m]=Pow3[n*m];
for (int i=1;i<=n;i++)
for (int j=0;j<=m;j++)
if (i!=n||j!=m)
dp[n][m]=(-1LL*C[n-1][i-1]*C[m][j]%mod
*Pow3[(n-i)*(m-j)]%mod*dp[i][j]%mod
+dp[n][m])%mod;
dp[n][m]=(dp[n][m]+mod)%mod;
}
int n,m;
while (~scanf("%d%d",&n,&m))
printf("%d\n",dp[n][m]);
return 0;
}
51Nod1634 刚体图 动态规划 容斥原理 排列组合的更多相关文章
- 【BZOJ 3505】 [Cqoi2014]数三角形 容斥原理+排列组合+GCD
我们先把所有三角形用排列组合算出来,再把一行一列上的三点共线减去,然后我们只观察向右上的三点共线,向左上的乘二即可,我们发现我们如果枚举所有的两边点再乘中间点的个数(GCD),那么我们发现所有的两边点 ...
- 排列组合或容斥原理 SPOJ - AMR11H
题目链接: https://vjudge.net/contest/237052#problem/H 这里给你一串数字,让你计算同时拥有这串数字最大值和最小值的子集(连续)和子序列(可以不连续)的数量, ...
- 【专题】计数问题(排列组合,容斥原理,Prufer序列)
[容斥原理] 对于统计指定排列方案数的问题,一个方案是空间中的一个元素. 定义集合x是满足排列中第x个数的限定条件的方案集合,设排列长度为S,则一共S个集合. 容斥原理的本质是考虑[集合交 或 集合交 ...
- 【CodeForces】914 H. Ember and Storm's Tree Game 动态规划+排列组合
[题目]H. Ember and Storm's Tree Game [题意]Zsnuoの博客 [算法]动态规划+排列组合 [题解]题目本身其实并不难,但是大量干扰因素让题目显得很神秘. 参考:Zsn ...
- 【CodeForces】889 C. Maximum Element 排列组合+动态规划
[题目]C. Maximum Element [题意]给定n和k,定义一个排列是好的当且仅当存在一个位置i,满足对于所有的j=[1,i-1]&&[i+1,i+k]有a[i]>a[ ...
- [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)
[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...
- [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理)
[Codeforces 997C]Sky Full of Stars(排列组合+容斥原理) 题面 用3种颜色对\(n×n\)的格子染色,问至少有一行或一列只有一种颜色的方案数.\((n≤10^6)\) ...
- HDU 4497 GCD and LCM(分解质因子+排列组合)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L.告诉你G.L,求满 ...
- 数组排列组合问题——BACKTRACKING
BACKTRACKING backtracking(回溯法)是一类递归算法,通常用于解决某类问题:要求找出答案空间中符合某种特定要求的答案,比如eight queens puzzle(将国际象棋的八个 ...
随机推荐
- mac 上如何安装非app store上的下载的软件-------打开未知来源
打开了 Terminal 终端后 ,在命令提示后输入 sudo spctl --master-disable 并按下回车执行,如下图所示. 随后再输入当前 Mac 用户的密码,如下图所示. 如 ...
- 【原创】大数据基础之Airflow(2)生产环境部署airflow研究
一 官方 airflow官方分布式部署结构图 airflow进程 webserver scheduler flower(非必须) worker airflow缺点 scheduler单点 通过在sch ...
- 软件测试-历史bug回顾(持续更新~)
1.第一次编写程序的时候非常不容易看出的错误就是 = 和 == 的区别. 赋值符号,判断符号之间有着天差地别.导致一直循环错误,一直苦苦找寻愿意无果,一步步看代码解决. 2.对于终结条件判断不是很清楚 ...
- deepin、Ubuntu安装Nginx
deepin安装nginx 切换至root用户 su 密码: 基础库的安装 安装gcc g++的依赖库 sudo apt-get install build-essential && ...
- verilog 异步复位代码
module reset_sync (input clk, input reset_in, output reset_out); (* ASYNC_REG = 'b1; (* ASYNC_REG = ...
- 放一点百度来的,常见的windowserror
0操作成功完成.1功能错误.2系统找不到指定的文件.3系统找不到指定的路径.4系统无法打开文件.5拒绝访问.6句柄无效.7存储控制块被损坏.8存储空间不足,无法处理此命令.9存储控制块地址无效.10环 ...
- Win#password;;processon #clone;;disassemble;;source find
1.密码学思维导图 源地址:https://www.processon.com/view/5a61d825e4b0c090524f5b8b 在这之前给大家分享 如何在 processon上搜索公开克隆 ...
- python(5):scipy之numpy介绍
python 的scipy 下面的三大库: numpy, matplotlib, pandas scipy 下面还有linalg 等 scipy 中的数据结构主要有三种: ndarray(n维数组), ...
- cf1143E 倍增好题!
一开始感觉用莫队可以搞一下,但是看了题解才发现这题其实是倍增套路题 把排列转换成nxt数组,然后倍增dp[i][j]表示第i个数后面有(1<<j)个数的最靠左的区间 然后从右往左扫一次即可 ...
- HTML添加图像和超链接
添加图像 <img src="图像的文件地址" alt="加载失败" height="350" width="350&quo ...