[集训]Trominoes,钩子公式运用
题意
用这四种骨牌密铺n*m的正方形矩阵,可以不选,求方案数。n*m<=1E8。多组询问。
思考
用如上的表达难以进行计算,尝试转化为一种新的组合解释。
若从右上角开始填起,我们强制要求里面的轮廓线是单调增的。例如:
这种方法既不影响合法性,又不会重复计数。
可以看见,我们只关心轮廓线的形状,不关心其他部分的细节,因此我们可以用长度为n+m的01串来表示其反向。在此处,默认01串从左下角向右上角写起,0代表上,1代表右。
每填充一个骨牌,可以发现这样的转移:
0001->1000
0011->1010
0101->1100
0111->1110
除了第四位上的数字,其余的三位在二进制表示下是完备的,也就是说,可以看做是单一的1先前移动了3位。
至此,原问题表述为:给定一个开头有n个1,末尾有m个0的字符串,每次可将1向前移动三位到一个字符为0的位置上,问构成开头有m个0,末尾有n个1的字符串的方案数有多少个。
该问题又可以划分为三个子问题,因为位置模3的余数不同的互不影响。也就是考虑若每次向右移动一个,有多少方案。
这个问题可以看做是经典的买票问题,使用钩子公式解决。复杂度O(n*m/3+T*n)
代码
- #include<bits/stdc++.h>
- #define mod 1000000007
- using namespace std;
- typedef long long int ll;
- ll fac[],n,m,T;
- void init()
- {
- fac[]=;
- for(int i=;i<=;++i)
- fac[i]=fac[i-]*i%mod;
- }
- ll qpow(ll x,ll y)
- {
- ll ans=,base=x;
- while(y)
- {
- if(y&)
- ans=ans*base%mod;
- base=base*base%mod;
- y>>=;
- }
- return ans;
- }
- inline ll C(int x,int y)
- {
- return fac[x]*qpow(fac[y],mod-)%mod*qpow(fac[x-y],mod-)%mod;
- }
- inline ll get(ll n,ll m)
- {
- ll ans=,sum=;
- for(int i=;i<=n;++i)
- {
- ans=ans*fac[i+m-]%mod;
- sum=sum*fac[i-]%mod;
- // for(int j=1;j<=m;++j)
- // ans=ans*(i+j-1)%mod;
- }
- return fac[n*m]*qpow(ans,mod-)%mod*sum%mod;
- }
- int main()
- {
- ios::sync_with_stdio(false);
- init();
- cin>>T;
- while(T--)
- {
- cin>>n>>m;
- if(n*m%!=)
- {
- cout<<<<endl;
- continue;
- }
- if(n%!=)
- swap(n,m);
- int base0=m/;
- int left0=base0,left1=base0+(m%>),left2=base0+(m%>);
- ll ans=get(n/,left0)*get(n/,left1)%mod*get(n/,left2)%mod;
- ans=ans*C((left0+left1+left2)*n/,left0*n/)%mod;
- ans=ans*C((left1+left2)*n/,left1*n/)%mod;
- cout<<ans<<endl;
- }
- return ;
- }
[集训]Trominoes,钩子公式运用的更多相关文章
- loj 6051 「雅礼集训 2017 Day11」PATH - 多项式 - 钩子公式
题目传送门 传送门 设 $m = \sum_{i = 1}^{n} a_i$. 总方案数显然等于 $\frac{m!}{\prod_{i = 1}^{n} a_i!}$. 考虑这样一个网格图,第 $i ...
- POJ2779 线性DP 或 杨氏三角 和 钩子公式
POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...
- bzoj 2483: Pku2279 Mr. Young's Picture Permutations -- 钩子公式
2483: Pku2279 Mr. Young's Picture Permutations Time Limit: 1 Sec Memory Limit: 128 MB Description ...
- HihoCoder 1480:矩阵填数 (杨氏矩阵 || 钩子公式 + 筛逆元)
描述 小Hi在玩一个游戏,他需要把1, 2, 3, ... NM填入一个N行M列的矩阵中,使得矩阵每一行从左到右.每一列从上到下都是递增的. 例如如下是3x3的一种填法: 136 247 589 给定 ...
- poj2279排队——杨氏矩阵与钩子公式(DP爆内存)
题目:http://poj.org/problem?id=2279 书上的DP做法会爆内存,尝试写了一个,过了样例. 转载: 代码如下: #include<iostream> #inclu ...
- POJ2279杨氏矩阵+钩子定理
题目:http://poj.org/problem?id=2279 有dp做法,但会MLE. dp的思想很好,是通过 “按身高由小到大往进放” 把 “身高小于” 的条件转化成 “放进去的先后” ,于是 ...
- poj2279——Mr. Young's Picture Permutations
Description Mr. Young wishes to take a picture of his class. The students will stand in rows with ea ...
- 喵哈哈村的魔法考试 Round #7 (Div.2) 题解
喵哈哈村的魔法考试 Round #7 (Div.2) 注意!后四道题来自于周日的hihocoder offer收割赛第九场. 我建了个群:欢迎加入qscoj交流群,群号码:540667432 大概作为 ...
- AOAPC I: Beginning Algorithm Contests (Rujia Liu) Volume 6. Mathematical Concepts and Methods
uva 106 这题说的是 说计算 x^2 + y^2 = z^2 xyz 互质 然后计算个数和 在 N内 不在 勾股数之内的数的个数 然后去找需要的 维基百科上 看到 另 n*m*2 =b ...
随机推荐
- Python11_文件的读写
1.打开和关闭文件(文件对象的方法open,close) file object = open(file_name [, access_mode][, buffering]) 各个参数的细节如下: f ...
- python实现单词本功能
#实现简单的单词本:# 可以添加单词和词义,当所添加的单词已经存在 让用户知道:# 查找单词,单词不存在时,让用户知道# 删除单词,当删除的单词不存在时,让用户知道# 以上功能无限制操作,直到用户输入 ...
- 简易数据分析 15 | Web Scraper 高级用法——CSS 选择器的使用
这是简易数据分析系列的第 15 篇文章. 年末事情比较忙,很久不更新了,后台一直有读者催更,我看了一些读者给我的私信,发现一些通用的问题,所以单独写篇文章,介绍一些 Web Scraper 的进阶用法 ...
- docker.service 修改指南
vi /lib/systemd/system/docker.service docker.service默认内容如下: [Unit] Description=Docker Application Co ...
- 有关常用的UI组件
前段时间想看看大家都用什么UI组件,下面是在网上搜集的,记录在这里方便自己使用和其他小伙伴使用 1:WeUI 小程序–使用教程 https://weui.io/ 官方介绍:WeUI 是一套同微信原生视 ...
- docker-代理服务器
配置Docker以使用代理服务器 如果容器需要使用HTTP,HTTPS或FTP代理服务器,则可以通过不同方式对其进行配置: 在Docker 17.07及更高版本中,可以 将Docker客户端配置为自动 ...
- Bandicam(班迪录屏)高清视频录制工具
Bandicam(班迪录屏)简单好用的录屏幕,录游戏,录视频的功能强大的屏幕录像软件,比起其他软件其性能更加卓越. 与其他软件相比,用Bandicam录制的视频大小更小, 不仅保证原文件的质量.
- Essential C++学习笔记
1.当我们调用一个函数时,会在内存中建立起一块特殊区域,称为“程序栈”,这块特殊区域提供了每个函数参数的存储空间,它也提供函数所定义的每个对象的内存空间--我们将这些对象称为局部对象.一旦函数完成,这 ...
- SQL Server2012高可用之日志传送测试
(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库: 辅助服务器:用于存放主服务器上数据库的一个“镜像”数据库: 监控服务器:用来监控 ...
- ODBC连接时报错不可识别的数据库格式
报这个错误是因为Acess的版本不同. 2003版本的Acess的数据连接字符串: string dataBasePath = @"C:/Users/user/Documents/Test. ...