题意

这四种骨牌密铺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. mybatis 整合redis作为二级缓存

    核心关键在于定义一个RedisCache实现mytis实现的Cache接口 ** * @author tele * @Description RedisCache由于需要传入id, 由mybatis进 ...

  2. Vue CLI 介绍安装

    https://cli.vuejs.org/zh/guide/ 介绍 警告 这份文档是对应 @vue/cli 3.x 版本的.老版本的 vue-cli 文档请移步这里. Vue CLI 是一个基于 V ...

  3. Text Style Transfer论文笔记

    Text Style Transfer主要是指Non-Parallel Data条件下的,具体的paper list见: https://github.com/fuzhenxin/Style-Tran ...

  4. 国内免费CMS系统大全

    一.ASP类的CMS程序 1.动易CMS 官方网址:http://www.powereasy.net/(可免费下载) 特点:完全免费,ACCESS数据库,主要功能模块:文章频道.下载频道.图片频道.留 ...

  5. K:缓存数据库双写数据一致性方案

    对于缓存和数据库双写,其存在着数据一致性的问题.对于数据一致性要求较高的业务场景,我们通常会选择使用分布式事务(2pc.paxos等)来保证缓存与数据库之间的数据强一致性,但分布式事务的复杂性与对资源 ...

  6. js/jq判断鼠标滚轮方向

    js判断鼠标滚轮方向: var scrollFunc = function (e) { e = e || window.event; if (e.wheelDelta) { //判断浏览器IE,谷歌滑 ...

  7. Web基础了解版10-Filter-Listener

    Filter 对于WEB应用来说,过滤器是一个驻留在服务器中的WEB组件,他可以截取客户端和WEB资源之间的请求和响应信息. 在一个WEB应用中可以部署多个过滤器,多个过滤器就组成了一个过滤器链,请求 ...

  8. linux 没有音频输出的解决方式

    用户级别的-/.asoundrc 文件. 如果文件不存在,可以手动创建. 其中的各个 ID,请根据实际情况调整: defaults.pcm.card 1 defaults.pcm.device 0 d ...

  9. Python基础入门必备知识

    1 标识符标识符是编程时使用的名字,用于给变量.函数.语句块等命名,Python 中标识符由字母.数字.下划线组成,不能以数字开头,区分大小写. 以下划线开头的标识符有特殊含义,单下划线开头的标识符, ...

  10. smarty -- foreach用法详解

    {foreach},{foreachelse} 用于像访问序数数组一样访问关联数组 {foreach},{foreachelse} {foreach} is used to loop over an  ...