Description


\(n,m<=1e4,mod ~1e9+7\)

题解:


显然右边那个图形只有旋转90°和270°后才能放置。

先考虑一个暴力的轮廓线dp:

假设已经放了编号前i的骨牌,那么这些骨牌形成的图形一定是杨表那样的。

对轮廓线来考虑,不妨设1表示向上走,0表示向右走。

初始状态是:111…(n个1)000..(m个0)

那么四种转移为:

  1. 1110->0111
  2. 1000->0001
  3. 1010->0011
  4. 1100->0101

这样暴力dp应该能过n,m<=10的。

观察这四种转移,中间的两位都不变,只是把第1位的1移到第4位。

那么按\(mod~3\)分开做,问题变为有一个x+y长的01序列,一开始是x个1+y个0.

每次可以把一个1和紧接的0交换,求最后变为x个0+y个1的方案数。

再把这个转到x×y的杨图上去,一开始轮廓线紧贴左边界和上边界,每次可以把轮廓线的一行改宽一列,且还要满足轮廓线的性质,其实这就是x×y的杨图个数,套钩子定理即可。

那么\(Ans=(xy)!/\prod_{i=0}^{n-1}\prod_{j=1}^{m-1}(i+j+1)!\)

Code:


#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())
#define fi first
#define se second
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=1000000007;
ll powmod(ll a,ll b) {ll res=1;a%=mod;for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
int fac[34000100];
int _,n,m;
int main() {
freopen("trominoes.in", "r", stdin);
freopen("trominoes.out", "w", stdout);
ll s=1;
fac[0]=1;
rep(i,1,34000000) fac[i]=(ll)fac[i-1]*i%mod;
for (scanf("%d",&_);_;_--) {
scanf("%d%d",&n,&m);
if (n*m%3!=0) {
puts("0");
continue;
}
if (n%3!=0) swap(n,m);
ll ret=fac[n*m/3],rg=1;
rep(i,0,m) {
ret=ret*fac[i/3]%mod;
rg=rg*fac[i/3+n/3]%mod;
}
ret=ret*powmod(rg,mod-2)%mod;
printf("%lld\n",ret);
}
}

【NOI2019模拟2019.7.1】三格骨牌(轮廓线dp转杨图上钩子定理)的更多相关文章

  1. [LeetCode] Domino and Tromino Tiling 多米诺和三格骨牌

    We have two types of tiles: a 2x1 domino shape, and an "L" tromino shape. These shapes may ...

  2. [JZOJ6244]【NOI2019模拟2019.7.1】Trominoes 【计数】

    Description n,m<=10000 Solution 考虑暴力轮廓线DP,按顺序放骨牌 显然轮廓线长度为N+M 轮廓线也是单调的 1表示向上,0表示向右 N个1,M个0 只能放四种骨牌 ...

  3. [JZOJ6247]【NOI2019模拟2019.6.27】C【计数】

    Description n<=200000 Solution 比赛时没做出这道题真的太弟弟了 首先我们从小到大插入数i,考虑B中有多少个区间的最大值为i 恰好出现的次数不太好计算,我们考虑计算最 ...

  4. [JZOJ6244]【NOI2019模拟2019.7.1】islands【计数】【图论】

    Description n<=1e9,M,K<=100 Solution 显然任选m个港口的答案是一样的,乘个组合数即可. 考虑枚举m个港口的度数之和D 可以DP计算 记\(F_{m,D} ...

  5. [JZOJ6241]【NOI2019模拟2019.6.29】字符串【数据结构】【字符串】

    Description 给出一个长为n的字符串\(S\)和一个长为n的序列\(a\) 定义一个函数\(f(l,r)\)表示子串\(S[l..r]\)的任意两个后缀的最长公共前缀的最大值. 现在有q组询 ...

  6. 【NOI2019模拟2019.6.29】字符串(SA|SAM+主席树)

    Description: 1<=n<=5e4 题解: 考虑\(f\)这个东西应该是怎样算的? 不妨建出SA,然后按height从大到小启发式合并,显然只有相邻的才可能成为最优答案.这样的只 ...

  7. 【NOI2019模拟2019.6.29】组合数(Lucas定理、数位dp)

    Description: p<=10且p是质数,n<=7,l,r<=1e18 题解: Lucas定理: \(C_{n}^m=C_{n~mod~p}^{m~mod~p}*C_{n/p} ...

  8. 【NOI2019模拟2019.7.4】朝夕相处 (动态规划+BM)

    Description: 题解: 这种东西肯定是burnside引理: \(\sum置换后不动点数 \over |置换数|\) 一般来说,是枚举置换\(i\),则\(对所有x,满足a[x+i]=a[i ...

  9. 【NOI2019模拟2019.6.27】B (生成函数+整数划分dp|多项式exp)

    Description: \(1<=n,k<=1e5,mod~1e9+7\) 题解: 考虑最经典的排列dp,每次插入第\(i\)大的数,那么可以增加的逆序对个数是\(0-i-1\). 不难 ...

随机推荐

  1. 【前端优化】图片延迟加载Lazy-loading的原理与简单实现

    1.什么是lazy-loading 图片"懒加载" 为img标签src设置统一的图片链接,而将真实链接地址装在自定义属性中. 所以开始时候图片是不会加载的,我们将满足条件的图片的s ...

  2. spring中配置Properties对象的方法

    工作中有必要将Properties对象进行注解进入:比如 class Person{ @Autowired private Properties properties; } 如果有这种需求的话,那么需 ...

  3. mongoose 常用数据库操作 删除

    删除 Model.remove(conditions, [callback]) try.js var User = require("./user.js"); function d ...

  4. php获取微信openid

    使用微信接口,无论是自动登录还是微信支付我们首先需要获取的就是openid,获取openid的方式有两种,一种是在关注的时候进行获取,这种订阅号就可以获取的到,第二种是通过网页授权获取,这种获取需要的 ...

  5. web框架express学习一

    服务端 node app.jsapp.jslet express = require("express"); let http = require("http" ...

  6. 超实用的HTML代码段(赵荣娇)

    第1章 创建HTML文档 11.1 HTML文档的基本结构 2 <html> <head> <title>Title of page</title> & ...

  7. IO流分类

    IO流在java中从输入和输出角度分类: 1.输入流 2.输出流 IO流在java中从数据的角度来分类: 1.字符流:文本,我们能读懂的都可以认为是字符流,如:文章,java文件等 字符输入流的超类: ...

  8. go变量和声明

    go变量和声明 这将是美好的开始和结束,通过写下x = 4,我们查看变量,可以说声明了一个变量并赋值,但是很不幸,go语言变量声明和赋值比这更复杂.通过学习一些简单的示例开始学习变量声明和赋值.然后在 ...

  9. NOIP模拟测试19

    T1: 题目大意:将一颗有N个节点的树分割,使得每个联通块大小相等,问一共有多少方案.(N<=1000000) 首先,一条很显然的性质,每个联通块的大小一定是N的因子. 然后,我们可以对于每个因 ...

  10. 【LeetCode 24】两两交换链表中的节点

    题目链接 [题解] 简单的链表操作 [代码] /** * Definition for singly-linked list. * struct ListNode { * int val; * Lis ...