首先,我们可以得到:每一行的数都是互不相同的,所以每一行都会有且仅有一个在 $[0, m]$ 的数没有出现。

我们可以考虑设 $Dp[i][j]$ 为处理完倒数 $i$ 行,倒数第 $i$ 行缺的数字是 $j$ 的方案数。

那么就有:

$$Dp[i][j] = \sum_{k=max(0,j-1)}^{m}Dp[i - 1][k]$$

自己画一画图就可以明白了,在这里就不解释了。毕竟 Gromah 太懒($ru\grave{o}$)

然后我们考虑把这个转移图画出来:

然后就是求这个图中从右上到左下的路径条数嘛。(每次只能往左或者是往右下或者是往下)

转化一下,实际上就是求这个东西:

从 $(0,0)$ 到 $(n*2+m+1,m+1)$,每次可以 $x+1,y-1$ 或者 $x+1,y+1$,并且不穿过 $y=0$ 和 $y=m+1$ 这两条直线的路径条数。

首先,全集是 ${n*2+m+1 \choose m+1}$,

然后我们算穿过 $y=0$ 的路径条数,既然穿过 $y=0$ 就必然经过 $y=-1$,于是我们让终点和 $y=m+2$ 这条直线沿着 $y=-1$ 翻转,

然后就可以算出 $(0,0)$ 到翻转之后的终点的路径条数。

于是还没完。还有那些先穿过 $y=0$ 再又穿过 $y=m+1$ 这条直线的路径我们要加回来。。。

于是又把坐标系沿着翻转之后的 $y=m+2$ (此时应该是 $y=-m-4$ 了)再次翻转。再统计答案。。。

直到方案为 $0$ 了为止。

计算穿过 $y=m+1$ 的路径条数同理。。。

我知道我语言表达能力及其低下,所以还是上代码好了。。。

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
#define N 3000000
#define Mod 1000000007 int n, m, ans = ;
int Fac[N + ], Inv[N + ]; inline int power(int u, int v)
{
int res = ;
for (; v; v >>= )
{
if (v & ) res = (LL) res * u % Mod;
u = (LL) u * u % Mod;
}
return res;
} inline void Prepare()
{
Fac[] = Inv[] = ;
for (int i = ; i <= N; i ++)
Fac[i] = (LL) Fac[i - ] * i % Mod;
Inv[N] = power(Fac[N], Mod - );
for (int i = N - ; i ; i --)
Inv[i] = (LL) Inv[i + ] * (i + ) % Mod;
} inline int C(int u, int v)
{
if (u < || v < || u < v) return ;
return (LL) Fac[u] * Inv[v] % Mod * Inv[u - v] % Mod;
} inline int T(int u, int v)
{
if (u < abs(v)) return ;
return C(u, u - abs(v) >> );
} inline int Inc(int u, int v)
{
return u + v - (u + v >= Mod ? Mod : );
} int main()
{
#ifndef ONLINE_JUDGE
freopen("4005.in", "r", stdin);
freopen("4005.out", "w", stdout);
#endif Prepare();
scanf("%d%d", &n, &m);
int x = n * + m + ;
ans = T(x, m + ); for (int y = m + , y_1 = -, y_2 = m + ; x >= abs(y); )
{
y = * y_1 - y;
y_2 = * y_1 - y_2;
ans = Inc(ans, Mod - T(x, y));
y = * y_2 - y;
y_1 = * y_2 - y_1;
ans = Inc(ans, T(x, y));
} for (int y = m + , y_1 = m + , y_2 = -; x >= abs(y); )
{
y = * y_1 - y;
y_2 = * y_1 - y_2;
ans = Inc(ans, Mod - T(x, y));
y = * y_2 - y;
y_1 = * y_2 - y_1;
ans = Inc(ans, T(x, y));
} printf("%d\n", ans); #ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
#endif
return ;
}

4005_Gromah

BZOJ 4005 [JLOI 2015] 骗我呢的更多相关文章

  1. [JLOI 2015]骗我呢

    传送门 Description 求给\(n*m\)的矩阵填数的方案数 满足: \[ 1\leq x_{i,j}\leq m \] \[ x_{i,j}<x_{i,j+1} \] \[ x_{i, ...

  2. BZOJ 4004 [JLOI 2015] 装备购买 解题报告

    哎这个题 WA 了无数遍...果然人太弱... 首先我们把这些装备按照花费从小到大排序,然后依次考虑是否能买这个装备. 至于这样为什么是对的,好像有一个叫拟阵的东西可以证明,然而我不会.TATQAQ ...

  3. 【BZOJ4005】[JLOI2015] 骗我呢(容斥,组合计数)

    [BZOJ4005][JLOI2015] 骗我呢(容斥,组合计数) 题面 BZOJ 洛谷 题解 lalaxu #include<iostream> using namespace std; ...

  4. [JLOI2015]骗我呢

    [JLOI2015]骗我呢 Tags:题解 作业部落 评论地址 TAG:数学,DP 题意 骗你呢 求满足以下条件的\(n*m\)的矩阵的个数对\(10^9+7\)取模 对于矩阵中的第\(i\)行第\( ...

  5. 「JLOI2015」骗我呢 解题报告?

    「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...

  6. [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机

    [LOJ 2134][UOJ 132][BZOJ 4200][NOI 2015]小园丁与老司机 题意 给定平面上的 \(n\) 个整点 \((x_i,y_i)\), 一共有两个问题. 第一个问题是从原 ...

  7. [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会

    [LOJ 2133][UOJ 131][BZOJ 4199][NOI 2015]品酒大会 题意 给定一个长度为 \(n\) 的字符串 \(s\), 对于所有 \(r\in[1,n]\) 求出 \(s\ ...

  8. [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)

    [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...

  9. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

随机推荐

  1. 关于Apache Commons-Lang的总结

    部分转载至:http://linhongyu.blog.51cto.com/6373370/1553329 一.前言 Java码农不识Apache,敲尽一生也枉然.旗下的开源项目众多,各个都是吊炸天. ...

  2. 关于Git中的一些常用的命令

    深入了解git的checkout命令 检出命令(git checkout)是Git最常用的命令之一,同时也是一个很危险的命令. 因为这条命令会重写工作区.检出命令的用法如下: 用法一: git che ...

  3. 【汉诺塔问题】UVa 10795 - A Different Task

    [经典汉诺塔问题] 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上.有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动 ...

  4. date 命令

    在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的工作带来诸多方便.1.命令格式: date [参数] ...

  5. 未完待续的JAVA基础知识

    第二卷 1.每个JAVA程序必须有一个main函数,但并非是每个类都有,main函数必须声明为static函数. 2.println与print之间的区别是换行与不换行. 3.在JAVA中,不想C/C ...

  6. effective c++(05)(06)之c++默默编写并调用的函数

    1. 当只写一个空类的时候,编译器会为他声明一个copy构造函数,一个copy assignment函数和一个析构函数.如下: 如果写下: class Empty{ }; 编译器就会实现以下代码: c ...

  7. union 和 union all 的区别

    Union因为要进行重复值扫描,所以效率低.如果合并没有刻意要删除重复行,那么就使用Union All  两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致): 如果我们需要将两个 ...

  8. 【转】图解SQL的各种连接join

    原帖地址:http://www.nowamagic.net/librarys/veda/detail/936 图解SQL的各种连接join 让你对SQL的连接一目了然 在 2011年12月22日 那天 ...

  9. jquery个人笔记

    一.链式操作 <!DOCTYPE html> <html> <head> <title></title> <script src = ...

  10. Codevs 1173 最优贸易 2009年NOIP全国联赛提高组

    1173 最优贸易 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description [问题描述] C 国有n ...