Description

传送门

Solution

如果单独考虑一行i,则左边位置的数严格比右边位置的数小。而一行有m个位置,它们可以填[0,m]这m+1个数,则必然有一个数不存在。

定义第i行的第j位突变需要满足$x[i][j+1]-x[i][j]>1$,此时不存在的数为j。

通过分析可以得到,假如在i-1行的突变位置为j+1,则第i行突变位置的合法范围为[j,m]。*

设f[i][j]为在第i行,突变位置为j的情况数。

则递推式为:$f[i][j]=f[i-1][j+1]+f[i][j-1]$。

因为当第i-1行在第j+1位突变,第i行的突变位置即为j。f[i][j-1]为在[0,j-1]位突变的情况数,由*可得知这些情况也同样可以在第j位突变。

特殊的,$f[i][0]=f[i-1][0]+f[i-1][1]$,$f[i][m]=f[i][m-1]$。

如图,我们把转移画出来后将第i行往右移i-1格并建立虚拟节点来满足f[i][0]的转移。

图中的n=3,m=3。

此时的点(n,n+m+1)[即为第n行第n+m个点]表示的并不是所有情况之和,而是第n行突变位置为m的情况数。

我们考虑多加一行一列,根据递推式,点(n+1,n+m+2)即为第n行所有情况之和了。

最后将得到图形补全为矩形后是会有n+1行n+m+2列。

将该图画在平面直角坐标系里(即将其翻转),则终点坐标为(n,n+m+1)

如图,直线ya=x+1和直线yb=x-(m+2)即为边界。

我们把多次越过同一边界视为只越过一次。则越界方案为ababa...或babab...。

则ans=总方案数-第一次越过a的次数-第一次越过b的次数。

对于先越过a的,考虑:-越界方案末尾为a的情况数+越界方案末尾为ba的方案数-越界方案末尾为aba的方案数。。。直到方案数为0。

对于越界方案末尾为a的情况数,为将整个图针对直线a翻转后(1,1)到对称终点的方案;当越界方案末尾为ba,则在上一个图的基础上把图沿着直线b翻转,计算(1,1)到本次到对称终点的方案数。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
typedef long long ll;
const int mod=1e9+;
int n,m;
ll fac[],inv[];
void pre()
{
fac[]=inv[]=;
fac[]=inv[]=;
for (int i=;i<=;i++)
{
fac[i]=fac[i-]*i%mod;
inv[i]=(mod-mod/i)*inv[mod%i]%mod;
}
for (int i=;i<=;i++) inv[i]=inv[i]*inv[i-]%mod;
}
ll C(int x,int y)
{
if (x<y||x<||y<) return ;
return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
ll cal(int x,int y)
{
if (x<||y<) return ;return C(x+y,y);
}
void turnA(int &x,int &y)
{
swap(x,y);
x--;y++;
}
void turnB(int &x,int &y)
{
swap(x,y);x+=m+;y-=m+;
}
ll ans;
int main()
{
scanf("%d%d",&n,&m);
pre();
ans=cal(n+m+,n);
int x=n+m+,y=n;
while (x>=&&y>=)
{
turnA(x,y);ans=(ans-cal(x,y))%mod;
turnB(x,y);ans=(ans+cal(x,y))%mod;
}
x=n+m+,y=n;
while (x>=&&y>=)
{
turnB(x,y);ans=(ans-cal(x,y))%mod;
turnA(x,y);ans=(ans+cal(x,y))%mod;
}
if (ans<) ans+=mod;
cout<<ans;
}

[BZOJ4005][JLOI2015]骗我呢-[dp+容斥]的更多相关文章

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

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

  2. bzoj4005[JLOI2015]骗我呢

    http://www.lydsy.com/JudgeOnline/problem.php?id=4005 神题~远距离orz 膜拜PoPoQQQ大神 #include<cstdio> #i ...

  3. [JLOI2015]骗我呢

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

  4. bzoj 3622 DP + 容斥

    LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...

  5. 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 94  Solved: 53 Description 废话不多说,反正小w要发喜 ...

  6. [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥

    题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...

  7. HDU 5838 (状压DP+容斥)

    Problem Mountain 题目大意 给定一张n*m的地图,由 . 和 X 组成.要求给每个点一个1~n*m的数字(每个点不同),使得编号为X的点小于其周围的点,编号为.的点至少大于一个其周围的 ...

  8. Codeforces 611C New Year and Domino DP+容斥

    "#"代表不能放骨牌的地方,"."是可以放 500*500的矩阵,q次询问 开两个dp数组,a,b,a统计横着放的方案数,b表示竖着放,然后询问时O(1)的,容 ...

  9. [BZOJ 1042] [HAOI2008] 硬币购物 【DP + 容斥】

    题目链接:BZOJ - 1042 题目分析 首先 Orz Hzwer ,代码题解都是看的他的 blog. 这道题首先使用DP预处理,先求出,在不考虑每种硬币个数的限制的情况下,每个钱数有多少种拼凑方案 ...

随机推荐

  1. Android绘制优化(一)绘制性能分析

    前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求.运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CP ...

  2. Django APP打包重用

    引言 有时候,我们需要将自己写的app分发(dist)给同事,分享给朋友,或者在互联网上发布,这都需要打包.分发我们的app. Django的子系统重用是基于app级别的.也就是一个项目可以包含多个互 ...

  3. Scrapy实现腾讯招聘网信息爬取【Python】

    一.腾讯招聘网 二.代码实现 1.spider爬虫 # -*- coding: utf-8 -*- import scrapy from Tencent.items import TencentIte ...

  4. java 结合反射、泛型、注解获取泛型对象

    由于自己也不是特别的理解,不能做过多的解释,因为这些是问过老师做出来的,我还没有学到这里.如果有解释错误的 指出来我改正一下.见谅~(如果学到这里了,会完善) 工具类(SQLUtil)核心代码: pa ...

  5. SQL Server 锁实验(SELECT加锁探究)

    本例中使用begin tran和with (holdlock)提示来观察SQL Server在select语句中的锁. 开启事务是为了保证时间极短的查询也能观察到锁情况,holdlock相当于开启序列 ...

  6. lua table排序报错与解决

    lua table排序 table的sort函数 比如按照大小进行排序,下面这种写法在某些情况下可能会排序错误,甚至报invalid order function for sorting table. ...

  7. Jenkins系统监测

    Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上.同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和 ...

  8. [Hive_add_8] Hive 常用参数配置

    0. 说明 记录 Hive 常用参数的配置 1. 设置本地模式 让 Hive 自动使用 Hadoop 的本地模式运行作业,提升处理性能 适合小文件,一般用于测试 set hive.exec.mode. ...

  9. phpstorm设置背景图片

    对于这个问题,其实很简单,连续按两下shift键或者是Ctrl+Shift+A键即可.出来的界面如下: 输入set Background Image命令,出现的界面如下: 然后选择图片, 点击ok,即 ...

  10. 第八章 计时器(BEEPER1)

    *------------------------------------- BEEPER1.C -- Timer Demo Program No. (c) Charles Petzold, ---- ...