[JZOJ6244]【NOI2019模拟2019.7.1】Trominoes 【计数】
Description
n,m<=10000
Solution
考虑暴力轮廓线DP,按顺序放骨牌
显然轮廓线长度为N+M
轮廓线也是单调的
1表示向上,0表示向右
N个1,M个0
只能放四种骨牌
四种转移写出来,就是
1000 0001
1110 0111
1010 0011
1100 0101
相当与一个1和后面3格的一个0换过来,中间不变
把模3相同的分组, 转换成只换相邻的10
再把它看作轮廓线,相当与每次只能放1×1的骨牌,问拓扑序个数
利用杨氏矩阵的钩子定理
就是矩阵大小的阶乘除以每个位置向右向下的位置个数和之积
最后再乘个组合数表示选的顺序
此时我们发现组合数约掉了,只剩下一个n×m的阶乘
直接计算即可。
Code
#include <bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fod(i,a,b) for(int i=a;i>=b;--i)
typedef long long LL;
const int mo=1000000007;
using namespace std;
int n,m,r,c[3][2],js[33333333];
LL ksm(LL k,LL n)
{
LL s=1;
for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo;
return s;
}
LL calc(int p)
{
int n=c[p][0],m=c[p][1];
LL s=1;
fo(i,1,n+m-1)
{
LL nv=ksm(i,mo-2),ct=max(0,min(m-1,i-1)-max(0,i-n)+1);
s=s*ksm(nv,ct)%mo;
}
return s;
}
int main()
{
int t;
cin>>t;
int R=33333332;
js[0]=1;
fo(i,1,R) js[i]=js[i-1]*(LL)i%mo;
while(t--)
{
cin>>n>>m;
memset(c,0,sizeof(c));
fo(i,0,n-1) c[i%3][0]++;
fo(i,n,n+m-1) c[i%3][1]++;
r=max(max(c[0][0]*c[0][1],c[1][0]*c[1][1]),c[2][0]*c[2][1]);
LL v=1;
int e=c[0][0]*c[0][1]+c[1][0]*c[1][1]+c[2][0]*c[2][1];
printf("%lld\n",calc(0)*calc(1)%mo*calc(2)%mo*js[e]%mo);
}
}
[JZOJ6244]【NOI2019模拟2019.7.1】Trominoes 【计数】的更多相关文章
- [JZOJ6244]【NOI2019模拟2019.7.1】islands【计数】【图论】
Description n<=1e9,M,K<=100 Solution 显然任选m个港口的答案是一样的,乘个组合数即可. 考虑枚举m个港口的度数之和D 可以DP计算 记\(F_{m,D} ...
- [JZOJ6247]【NOI2019模拟2019.6.27】C【计数】
Description n<=200000 Solution 比赛时没做出这道题真的太弟弟了 首先我们从小到大插入数i,考虑B中有多少个区间的最大值为i 恰好出现的次数不太好计算,我们考虑计算最 ...
- 【NOI2019模拟2019.7.1】为了部落 (生成森林计数,动态规划)
Description: \(1<=n<=1e9,1<=m,k<=100\) 模数不是质数. 题解: 先选m个点,最后答案乘上\(C_{n}^m\). 不妨枚举m个点的度数和D ...
- 【NOI2019模拟2019.7.1】三格骨牌(轮廓线dp转杨图上钩子定理)
Description \(n,m<=1e4,mod ~1e9+7\) 题解: 显然右边那个图形只有旋转90°和270°后才能放置. 先考虑一个暴力的轮廓线dp: 假设已经放了编号前i的骨牌,那 ...
- [JZOJ6241]【NOI2019模拟2019.6.29】字符串【数据结构】【字符串】
Description 给出一个长为n的字符串\(S\)和一个长为n的序列\(a\) 定义一个函数\(f(l,r)\)表示子串\(S[l..r]\)的任意两个后缀的最长公共前缀的最大值. 现在有q组询 ...
- 【NOI2019模拟2019.6.29】字符串(SA|SAM+主席树)
Description: 1<=n<=5e4 题解: 考虑\(f\)这个东西应该是怎样算的? 不妨建出SA,然后按height从大到小启发式合并,显然只有相邻的才可能成为最优答案.这样的只 ...
- 【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} ...
- 【NOI2019模拟2019.7.4】朝夕相处 (动态规划+BM)
Description: 题解: 这种东西肯定是burnside引理: \(\sum置换后不动点数 \over |置换数|\) 一般来说,是枚举置换\(i\),则\(对所有x,满足a[x+i]=a[i ...
- 【NOI2019模拟2019.6.27】B (生成函数+整数划分dp|多项式exp)
Description: \(1<=n,k<=1e5,mod~1e9+7\) 题解: 考虑最经典的排列dp,每次插入第\(i\)大的数,那么可以增加的逆序对个数是\(0-i-1\). 不难 ...
随机推荐
- jQuery导出word文档
DDoc.js function DDoc() { this.data = []; this.relationData = []; this.listCount = 0; this.counter = ...
- sql server 函数详解(4)日期和时间函数
时间和日期函数第一部分 时间和日期函数第二部分
- sql server 通配符
sql有四种通配符: -- %可以匹配任意长度的字符: -- _匹配单个字符: -- [charlist]匹配括号中的任何一个字符 -- [^]匹配不在括号中的任意单个字符 示例: --'[ab]'匹 ...
- Linux小知识:sudo su和su的区别
Linux小知识:sudo su和su的区别 本文是学习笔记,视频地址:https://www.bilibili.com/video/av62836363 su是申请切换root用户,需要申请root ...
- [转载]static in Java
来源:https://www.cnblogs.com/chenssy/p/3386721.html 一. static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现 ...
- O004、启动第一个KVM虚机
参考https://www.cnblogs.com/CloudMan6/p/5249270.html 本节演示如何使用 virt-manager 启动 KVM 虚机, 提前下载一个 cirro ...
- java中怎么跳出两层for循环
使用标号(使用标号跳出两层或者多层for循环): outterLoop: for (int i = 0; i < 9; i++){ for (int j = 0; j & ...
- vue中添加与删除,关键字搜索
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jQuery效果--淡入和淡出
jQuery Fading 方法 通过 jQuery,您可以实现元素的淡入淡出效果. jQuery 拥有下面四种 fade 方法: fadeIn() fadeOut() fadeToggle() fa ...
- easyui datagrid连续删除问题
如果在datagrid中直接将index传给easyui自带的deletRow方法来删除当前点击行,一开始并没有问题,但是当连续删除的时候就或出问题了. 原因是datagrid行是根据datagrid ...