首先,我们可以得到:每一行的数都是互不相同的,所以每一行都会有且仅有一个在 $[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. foo,bar,baz

    https://en.wikipedia.org/wiki/Foobar 原文: The terms foobar, foo, bar, baz and qux are sometimes used ...

  2. MySQL flush privileges 명령어

    INSERT나 UPDATE, DELETE문을 이용해서 MySQL의 사용자를 추가,삭제하거나, 사용자 권한 등을 변경하였을 때, MySQL에 변경사항을 적용하기 위해서 사용하는 명령 ...

  3. Spark1.2新特性概述

    http://mp.weixin.qq.com/s?__biz=MjM5NTc2MTg3Mw==&mid=201641685&idx=1&sn=1b75be3d774bb3f2 ...

  4. 【C#4.0图解教程】笔记(第19章~第25章)

    第19章 泛型 1.泛型概念 泛型提供了一种更准确地使用有一种以上的类型的代码的方式. 泛型允许我们声明类型参数化的代码,我们可以用不同的类型进行实例化. 泛型不是类型,而是类型的模板.   2.声明 ...

  5. asp:弹出警告框,并重定向的自定义过程

    因为制作的需要写了这样一个简单的函数,重定向可以是指定的页.也可以是前一页! 有两个参数:messtr,警告框的信息;urlstr:转向的网页,为""时,返回到前一页! 程序代码 ...

  6. ASP实现用年月日时分秒和两位随机数字来作为上传文件名的函数

    Public Function GetNewFileName() dim ranNum dim dtNow dtNow=Now() randomize ranNum=int(90*rnd)+10 Ge ...

  7. ACM——搜索(一)

    南邮OJ——1108 搜索(一) 时间限制(普通/Java):3500MS/10500MS          运行内存限制:65536KByte总提交:1023            测试通过:367 ...

  8. Java算法求最大最小值,冒泡排序,斐波纳契数列一些经典算法<不断更新中>

    清明在家,无聊,把一些经典的算法总结了一下. 一.求最大,最小值 Scanner input=new Scanner(System.in); int[] a={21,31,4,2,766,345,2, ...

  9. ubuntu下aircrack-ng的wifi破解

    首先安装aircrack-ng,apt-get install aircrack-ng. 然后打开shell,输入airmon-ng start wlan0. 输入airodump-ng mon0. ...

  10. iOS开发——手机号,密码,邮箱,身份证号,中文判断

    目前这些方面的判断主要是用了正则表达式 手机号的判断,目前主要是长度.均是数字,支持的号段由于第三方通讯比如京东通讯,小米通讯等支持的号段挺多, 有171,170,135,147等等,所以号段限制简单 ...