题目大意:有一个$n\times m$的网格图,若一个人的同一行或同一列有人,他就必须面向那个人,若都无人,就可以任意一个方向。若一个人无法确定方向,则方案不合法,问不同的方案数。$n,m\leqslant3000$

题解:令$f_{n,m}$表示$n\times m$的网格图的答案。$f_{0,i}=f_{i,0}=1$,考虑在原来基础上加一列

1. 这一列是空的。$f_{n,m}+=f_{n,m-1}$
2. 这一列放一个人,且他所在的一行无人,那么他可以放在这一列的任意一个位置,并且可以向$4$个方向。$f_{n,m}+=4\times nf_{n-1,m-1}$
3. 当$n\geqslant2$时,这一列放两个人,所以这两行都不能有人,这一列选取两个位置的方案数为$\binom n2$。$f_{n,m}+=\binom n2 f_{n-2,m-1}$
4. 当$m\geqslant2$时这一列放一个人,并且看向前面的一个人,这个人可以放在这一列的任意位置,并且前面一个人可以选择其中任意一列。$f_{n,m}+=n\times(m-1)f_{n-1,m-2}$

卡点:

C++ Code:

#include <cstdio>
#include <algorithm>
#include <iostream>
#define mul(a, b) (static_cast<long long> (a) * (b) % mod)
const int maxn = 3010, mod = 1e9 + 7; inline void reduce(int &x) { x += x >> 31 & mod; } int n, m;
int f[maxn][maxn];
int main() {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
std::cin >> n >> m;
for (int i = 0; i <= n; ++i) {
for (int j = 0; j <= m; ++j) {
if (!i || !j) {
f[i][j] = 1;
continue;
}
f[i][j] = f[i][j - 1];
reduce(f[i][j] += mul(4, f[i - 1][j - 1]) * i % mod - mod);
if (i > 1)
reduce(f[i][j] += 1ll * i * (i - 1) / 2 % mod * f[i - 2][j - 1] % mod - mod);
if (j > 1)
reduce(f[i][j] += mul(i, j - 1) * f[i - 1][j - 2] % mod - mod);
}
}
reduce(--f[n][m]);
std::cout << f[n][m] << '\n';
return 0;
}

[LOJ #2833]「JOISC 2018 Day 1」帐篷的更多相关文章

  1. LOJ 2840「JOISC 2018 Day 4」糖

    有趣的脑子题(可惜我没有脑子 好像也可以称为模拟费用流(? 我们考虑用链表维护这个东西 再把贡献扔到堆里贪心就好了 大概就是类似于有反悔机制的贪心?我们相当于把选中的一个打上一个-v的tag然后如果选 ...

  2. loj#2838 「JOISC 2018 Day 3」比太郎的聚会

    分析 预处理每个点的前根号小的距离 对于每次询问删除点小于根号则已经处理好 否则直接暴力dp即可 代码 #include<bits/stdc++.h> using namespace st ...

  3. LOJ #2831. 「JOISC 2018 Day 1」道路建设 线段树+Link-cut-tree

    用 LCT 维护颜色相同连通块,然后在线段树上查一下逆序对个数就可以了. code: #include <cstdio> #include <algorithm> #inclu ...

  4. Loj #2731 「JOISC 2016 Day 1」棋盘游戏

    Loj 2731 「JOISC 2016 Day 1」棋盘游戏 JOI 君有一个棋盘,棋盘上有 \(N\) 行 \(3\) 列 的格子.JOI 君有若干棋子,并想用它们来玩一个游戏.初始状态棋盘上至少 ...

  5. LOJ 2737 「JOISC 2016 Day 3」电报 ——思路+基环树DP

    题目:https://loj.ac/problem/2737 相连的关系形成若干环 / 内向基环树 .如果不是只有一个环的话,就得断开一些边使得图变成若干链.边的边权是以它为出边的点的点权. 基环树的 ...

  6. LOJ 2736 「JOISC 2016 Day 3」回转寿司 ——堆+分块思路

    题目:https://loj.ac/problem/2736 如果每个询问都是 l = 1 , r = n ,那么每次输出序列的 n 个数与本次操作的数的最大值即可.可以用堆维护. 不同区间的询问,可 ...

  7. loj 2392「JOISC 2017 Day 1」烟花棒

    loj 答案显然满足二分性,先二分一个速度\(v\) 然后显然所有没有点火的都会往中间点火的人方向走,并且如果两个人相遇不会马上点火,要等到火快熄灭的时候才点火,所以这两个人之后应该在一起行动.另外有 ...

  8. @loj - 6353@「CodePlus 2018 4 月赛」组合数问题 2

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 请你找到 k 个不同的组合数,使得对于其中任何一个组合数 \(C ...

  9. 「JOISC 2018 Day 3」比太郎的聚会

    题解: 很套路的题目 我们按照询问中的不算的个数是否大于$block$分类 如果大于,就$O(n)dp$一下 如果小于,就预处理出到每个点前$block$小的点 $block取\sqrt{n}$的话复 ...

随机推荐

  1. AGC028 E - High Elements

    AGC028 E - High Elements 有一个排列\(p\),你要分成两个子序列\(A,B\),满足\(A,B\)的LIS长度相等.设\(S\)是一个\(01\)序列,\(S_i=0\)当且 ...

  2. SQL基础-过滤数据

    一.过滤数据 1.使用WHERE子句 过滤数据:关键字WHERE SELECT 字段列表 FROM 表名 WHERE 过滤条件; 过滤条件一般由要过滤的字段.操作符.限定值三部分组成: 如: SELE ...

  3. sqlalchemy lock and atomic

    prepare: MYSQL tutorial Prepare a table set evn DBUSER=root DBPASS= DBNAME=cyborgTBNAME="atomic ...

  4. 【BZOJ4475】 [Jsoi2015]子集选取

    题目描述 数据范围 \(1\leq N,K \leq 10^9\) \(solution\) 集合S中每个元素互不影响,不妨依次考虑其中一个元素在三角形中的出现情况 问题转化为一个\(0/1\)的三角 ...

  5. 01-复杂度2 Maximum Subsequence Sum (25 分)

    Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to ...

  6. 【Excel】多条件查找

    例如下图:要求在单元格从C10中根据分类与名称找出相应的数量 1.VLOOKUP函数(数组公式) {=VLOOKUP(A10&B10,IF({1,0},A2:A6&B2:B6,C2:C ...

  7. Thinking In SE

    各种编程范式的区别 并发模型 并行架构: 位级(bit-level)并行 指令级(instruction-level)并行 数据级(data)并行 数据级并行 任务级(task-level)并行 -- ...

  8. TOMCAT 可以稳定支持的最大并发用户数

      微软系统平台上 TOMCAT性能调优后可以稳定支持的最大并发用户数量在300人服务器配置:   单硬盘,SATA 8MB缓存测试服务器和loadrunner运行服务器位于同一网段 100MB网络( ...

  9. js - 总结一下条件语句优化

    [笔记] // 简单的语句用三目运算符也可以的(除了需要return的) 1 == 1 ? console.log('执行了...1') : console.log(); 1 == 2 ? conso ...

  10. MySQL Group By 实例讲解(二)

    mysql group by使用方法实例讲解 MySQL中GROUP BY语句用于对某个或某些字段查询分组,并返回这个字段重复记录的第一条,也就是每个小组(无排序)里面的第一条. 本文章通过实例向大家 ...