题意

这四种骨牌密铺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,钩子公式运用的更多相关文章

  1. loj 6051 「雅礼集训 2017 Day11」PATH - 多项式 - 钩子公式

    题目传送门 传送门 设 $m = \sum_{i = 1}^{n} a_i$. 总方案数显然等于 $\frac{m!}{\prod_{i = 1}^{n} a_i!}$. 考虑这样一个网格图,第 $i ...

  2. POJ2779 线性DP 或 杨氏三角 和 钩子公式

    POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...

  3. bzoj 2483: Pku2279 Mr. Young's Picture Permutations -- 钩子公式

    2483: Pku2279 Mr. Young's Picture Permutations Time Limit: 1 Sec  Memory Limit: 128 MB Description   ...

  4. HihoCoder 1480:矩阵填数 (杨氏矩阵 || 钩子公式 + 筛逆元)

    描述 小Hi在玩一个游戏,他需要把1, 2, 3, ... NM填入一个N行M列的矩阵中,使得矩阵每一行从左到右.每一列从上到下都是递增的. 例如如下是3x3的一种填法: 136 247 589 给定 ...

  5. poj2279排队——杨氏矩阵与钩子公式(DP爆内存)

    题目:http://poj.org/problem?id=2279 书上的DP做法会爆内存,尝试写了一个,过了样例. 转载: 代码如下: #include<iostream> #inclu ...

  6. POJ2279杨氏矩阵+钩子定理

    题目:http://poj.org/problem?id=2279 有dp做法,但会MLE. dp的思想很好,是通过 “按身高由小到大往进放” 把 “身高小于” 的条件转化成 “放进去的先后” ,于是 ...

  7. 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 ...

  8. 喵哈哈村的魔法考试 Round #7 (Div.2) 题解

    喵哈哈村的魔法考试 Round #7 (Div.2) 注意!后四道题来自于周日的hihocoder offer收割赛第九场. 我建了个群:欢迎加入qscoj交流群,群号码:540667432 大概作为 ...

  9. 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   ...

随机推荐

  1. MYSQL 查询日期最大的那条记录

    首先把官网示例拿出来: 连接查询比子查询性能更好 3.6.4 The Rows Holding the Group-wise Maximum of a Certain Column Task: For ...

  2. Qt中动态链接库的使用

    转自: http://www.qtcn.org/bbs/read.php?tid=14719 现在有些软件有自动升级功能,有些就是下载新的DLL文件,替换原来的动态链接库.MFC好象也有类似机制 Qt ...

  3. STlink下载和打断点Debug调试小结

    一.下载 1.检查设备是否选择正确 2.检查SWDIO有没有识别到,如果没有,检查硬件连线是否正确. 3.检查Utilities选项 4.点击settings,添加FLASH. 二.Debug调试 前 ...

  4. 【重学Node.js 第1&2篇】本地搭建Node环境并起RESTful Api服务

    本地搭建Node环境并起RESTful Api服务 课程介绍看这里:https://www.cnblogs.com/zhangran/p/11963616.html 项目github地址:https: ...

  5. 006 管理Ceph的RBD块设备

    一, Ceph RBD的特性 支持完整和增量的快照 自动精简配置 写时复制克隆 动态调整大小 二.RBD基本应用 2.1 创建RBD池 [root@ceph2 ceph]# ceph osd pool ...

  6. Pycharm学生版安装教程(2019-12月更新)

    以下方法全部是官方渠道正版激活,可选择学生版(免费) 或企业版(付费) 我的机器学习教程「美团」算法工程师带你入门机器学习  以及 「三分钟系列」数据结构与算法  已经开始更新了,欢迎大家订阅~这篇专 ...

  7. 老板让阿粉学习 flink 中的 Watermark,现在他出教程了

    1 前言 在时间 Time 那一篇中,介绍了三种时间概念 Event.Ingestin 和 Process, 其中还简单介绍了乱序 Event Time 事件和它的解决方案 Watermark 水位线 ...

  8. 【退役记】CSP2019 退役记

    Day -1 机房自习,因为一些奇怪原因心不在焉 我可能太在意csp了 晚上有点扛不住去七楼阳台思考人生,得到了一些惊人的结论想下来由于某种原因继续跑到七楼思考人生 然后晚自习下课仰天大笑出门去,我辈 ...

  9. $Poj1934\ Trip$ 线性$DP+$搜索

    Luogu Description 爱丽丝和鲍伯想去度假,他们每个人都制定了一个参观城市的清单,该地区正好有26个城市,因此它们被编码为小写字母“a”到“z”.清单上可能重复出现某个城市.因为他们想一 ...

  10. java socket通讯

    本来是打算验证java socket是不是单线程操作,也就是一次只能处理一个请求,处理完之后才能继续处理下一个请求.但是在其中又发现了许多问题,在编程的时候需要十分注意,今天就拿出来跟大家分享一下. ...