题意

这四种骨牌密铺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)


代码

  1. #include<bits/stdc++.h>
  2. #define mod 1000000007
  3. using namespace std;
  4. typedef long long int ll;
  5. ll fac[],n,m,T;
  6. void init()
  7. {
  8. fac[]=;
  9. for(int i=;i<=;++i)
  10. fac[i]=fac[i-]*i%mod;
  11. }
  12. ll qpow(ll x,ll y)
  13. {
  14. ll ans=,base=x;
  15. while(y)
  16. {
  17. if(y&)
  18. ans=ans*base%mod;
  19. base=base*base%mod;
  20. y>>=;
  21. }
  22. return ans;
  23. }
  24. inline ll C(int x,int y)
  25. {
  26. return fac[x]*qpow(fac[y],mod-)%mod*qpow(fac[x-y],mod-)%mod;
  27. }
  28. inline ll get(ll n,ll m)
  29. {
  30. ll ans=,sum=;
  31. for(int i=;i<=n;++i)
  32. {
  33. ans=ans*fac[i+m-]%mod;
  34. sum=sum*fac[i-]%mod;
  35. // for(int j=1;j<=m;++j)
  36. // ans=ans*(i+j-1)%mod;
  37. }
  38. return fac[n*m]*qpow(ans,mod-)%mod*sum%mod;
  39. }
  40. int main()
  41. {
  42. ios::sync_with_stdio(false);
  43. init();
  44. cin>>T;
  45. while(T--)
  46. {
  47. cin>>n>>m;
  48. if(n*m%!=)
  49. {
  50. cout<<<<endl;
  51. continue;
  52. }
  53. if(n%!=)
  54. swap(n,m);
  55. int base0=m/;
  56. int left0=base0,left1=base0+(m%>),left2=base0+(m%>);
  57. ll ans=get(n/,left0)*get(n/,left1)%mod*get(n/,left2)%mod;
  58. ans=ans*C((left0+left1+left2)*n/,left0*n/)%mod;
  59. ans=ans*C((left1+left2)*n/,left1*n/)%mod;
  60. cout<<ans<<endl;
  61. }
  62. return ;
  63. }

[集训]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. Python11_文件的读写

    1.打开和关闭文件(文件对象的方法open,close) file object = open(file_name [, access_mode][, buffering]) 各个参数的细节如下: f ...

  2. python实现单词本功能

    #实现简单的单词本:# 可以添加单词和词义,当所添加的单词已经存在 让用户知道:# 查找单词,单词不存在时,让用户知道# 删除单词,当删除的单词不存在时,让用户知道# 以上功能无限制操作,直到用户输入 ...

  3. 简易数据分析 15 | Web Scraper 高级用法——CSS 选择器的使用

    这是简易数据分析系列的第 15 篇文章. 年末事情比较忙,很久不更新了,后台一直有读者催更,我看了一些读者给我的私信,发现一些通用的问题,所以单独写篇文章,介绍一些 Web Scraper 的进阶用法 ...

  4. docker.service 修改指南

    vi /lib/systemd/system/docker.service docker.service默认内容如下: [Unit] Description=Docker Application Co ...

  5. 有关常用的UI组件

    前段时间想看看大家都用什么UI组件,下面是在网上搜集的,记录在这里方便自己使用和其他小伙伴使用 1:WeUI 小程序–使用教程 https://weui.io/ 官方介绍:WeUI 是一套同微信原生视 ...

  6. docker-代理服务器

    配置Docker以使用代理服务器 如果容器需要使用HTTP,HTTPS或FTP代理服务器,则可以通过不同方式对其进行配置: 在Docker 17.07及更高版本中,可以 将Docker客户端配置为自动 ...

  7. Bandicam(班迪录屏)高清视频录制工具

    Bandicam(班迪录屏)简单好用的录屏幕,录游戏,录视频的功能强大的屏幕录像软件,比起其他软件其性能更加卓越. 与其他软件相比,用Bandicam录制的视频大小更小, 不仅保证原文件的质量.

  8. Essential C++学习笔记

    1.当我们调用一个函数时,会在内存中建立起一块特殊区域,称为“程序栈”,这块特殊区域提供了每个函数参数的存储空间,它也提供函数所定义的每个对象的内存空间--我们将这些对象称为局部对象.一旦函数完成,这 ...

  9. SQL Server2012高可用之日志传送测试

    (一)日志传送架构 (1.1)相关服务器 主服务器   :用于生产的服务器,上面运行这生产SQL Server数据库: 辅助服务器:用于存放主服务器上数据库的一个“镜像”数据库: 监控服务器:用来监控 ...

  10. ODBC连接时报错不可识别的数据库格式

    报这个错误是因为Acess的版本不同. 2003版本的Acess的数据连接字符串: string dataBasePath = @"C:/Users/user/Documents/Test. ...