首先,我们可以得到:每一行的数都是互不相同的,所以每一行都会有且仅有一个在 $[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. 关于egit的日常操作总结

    $git fetch -p --prune -p -- remove any remote tracking branches that no longer exist remotely prune的 ...

  2. MATLAB-ginput函数问题

    functions:Graphical input from mouse or cursor ginput提供了一个十字光标使我们能更精确的选择我们所需要的位置,并返回坐标值.函数调用形式为: [x, ...

  3. Redis的安装与使用

    一.什么 Redis REmote DIctionary Server,简称 Redis,是一个类似于Memcached的Key-Value存储系统.相比Memcached,它支持更丰富的数据结构,包 ...

  4. MySQL flush privileges 명령어

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

  5. h2database源码浅析:SQL语句的执行

    最近想好好了解一下数据库的原理,下载了h2database的源码,准备好好看看.此过程的一些想法,暂且记下来,权当做读码笔记吧! 为了调试准备的测试用例: @Test public void test ...

  6. asp搜索两个以上的词的原理

    通常会在许多网站上进行搜索一些内容,要输入两个或两个以上的词,它的原理是这样的: 假设在搜索框search中输入:“asp php” 先得到输入框中的内容:search=request("s ...

  7. 使用SQLdiag Utility搜集SQL Server诊断信息

    SQLdiag Utility用于搜集诊断信息,给Microsoft技术支持人员做为判断依据. 使用SQLdiag 会进行信息搜集类型 Windows 系统性能日志 Windows 系统日志 SQL ...

  8. try catch异常捕获

    格式为: try            {                int i = int.Parse(Console.ReadLine());           //容易发生错误的语句    ...

  9. 函数-头文件//Calculator.h

    // // Calculator.h // 函数-头文件 // // Created by zhangxueming on 15/6/2. // Copyright (c) 2015年 zhangxu ...

  10. java.util.regx Demo

    import java.util.regex.Matcher;import java.util.regex.Pattern; public class TestRegex { public stati ...