题目

描述

题目大意

给你一个n∗nn*nn∗n的网格图。从(0,0)(0,0)(0,0)开始,每次只可以向右或向上移动一格,并且不能越过对角线(即不能为x&lt;yx&lt;yx<y)。

网格图上面有一些障碍,不能经过障碍。

问从(0,0)(0,0)(0,0)到(n,n)(n,n)(n,n)的方案数


思考历程

说实话这题没有怎么特别仔细地思考过。

因为后面两题比较水,于是我就先做后面两题。可是后面两题的码量都有点大,于是没有时间了。

剩下的一点点时间里面完成30分暴力。

叫我半个gjy。


正解

先想想最简单的情况:C=0C=0C=0。

许多人发现了这种情况下就是裸的卡特兰数,可是为什么我即使打表也没有发现?

还是推一下吧。

首先答案为不考虑是否经过对角线的所有方案减去经过对角线的所有方案。

前者比较显然,即为C2nnC_{2n}^nC2nn​。可以将右移看作000,将上移看做111,那么这就是一个有nnn个000和nnn个111的排列。

然后就是如何求后者。

借用题解的图:



作出直线y=x+1y=x+1y=x+1,即图中粉色的线。

如果越过对角线,那么一定经过粉色的这条线。



(这张图里面已经有解析了)

对于一条经过粉色线的路径,选任意一个交点,将这个点到终点的路径关于粉色线对称。

容易发现其实经过粉线再到达终点的方案数等于到达终点对称点的方案数

终点对称点的坐标为(n−1,n+1)(n-1,n+1)(n−1,n+1),所以方案数为C2nn−1C_{2n}^{n-1}C2nn−1​。

用总数减去它即可。

现在考虑如何求C=1C=1C=1的情况。

很容易想到总数减去必须经过障碍的个数。

两点之间的方案数同样是作对称考虑,类似的。

看看这题CCC最多为100010001000,很小。

先将所有的点排序。

考虑DP,设fif_ifi​表示从起点到达第iii个障碍,不经过其它障碍的方案数。

总数就是起点到它的方案数,然后枚举先前的点,求同时经过这两个点的方案数。

方程为fi=dis(0,i)−∑j=1i−1dis(j,i)×fjf_i=dis(0,i)-\sum_{j=1}^{i-1}dis(j,i)\times f_jfi​=dis(0,i)−∑j=1i−1​dis(j,i)×fj​。

为了方便计算,可以设置第n+1n+1n+1个点,答案就是fn+1f_{n+1}fn+1​


代码

using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 100000
#define maxC 1001
#define mo 1000000007
int n,c;
struct DOT{
int x,y;
} d[maxC+2];
inline bool cmpd(const DOT &a,const DOT &b){
return a.x<b.x || a.x==b.x && a.y<b.y;
}
long long fac[N*2+1],inv[N*2+1];
inline long long my_pow(long long x,int y){
long long res=1;
for (;y;x=x*x%mo,y>>=1)
if (y&1)
res=res*x%mo;
return res;
}
inline long long C(int m,int n){
if (n<0)
return 0;
return fac[m]*inv[n]%mo*inv[m-n]%mo;
}
inline long long calc(int u,int v){
return (C((d[v].x-d[u].x)+(d[v].y-d[u].y),d[v].x-d[u].x)-C(((d[v].y-1)-d[u].x)+((d[v].x+1)-d[u].y),(d[v].y-1)-d[u].x)+mo)%mo;
}
long long f[maxC+2];
int main(){
// freopen("in.txt","r",stdin);
scanf("%d%d",&n,&c);
fac[0]=1,fac[1]=1;
inv[0]=1,inv[1]=1;
for (int i=2;i<=n*2;++i){
fac[i]=fac[i-1]*i%mo;
inv[i]=my_pow(fac[i],mo-2);
}
int tmp=0;
for (int i=1;i<=c;++i){
++tmp;
scanf("%d%d",&d[tmp].x,&d[tmp].y);
if (d[tmp].x<d[tmp].y)
--tmp;
}
c=tmp;
d[++c]={n,n};
sort(d+1,d+c+1,cmpd);
for (int i=1;i<=c;++i){
long long s=0;
for (int j=1;j<i;++j)
if (d[j].x<=d[i].x && d[j].y<=d[i].y)
s=(s+f[j]*calc(j,i))%mo;
long long t=calc(0,i);
f[i]=(calc(0,i)-s+mo)%mo;
}
printf("%lld\n",f[c]);
return 0;
}

总结

这是一种很经典的题型。

规定某些点不能走,问方案数。

那就设不能走的点被第一次到达,然后就能很好地解决了。

【五校联考5day1】登山的更多相关文章

  1. 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你

    [五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...

  2. 【五校联考1day2】JZOJ2020年8月12日提高组T1 对你的爱深不见底

    [五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y ...

  3. 五校联考 running (欧拉函数)

    题面 \(solution:\) 讲真吧,这道题真的出得,嗯,太恐怖了.考场上这道题真的把我看懵了,这道题以前是见过的,但欧拉函数?我学过吗?一道容斥都要超时的题目,我都要为我自己点根香了,拿着gcd ...

  4. 【五校联考3day2】C

    題意: 現有一平面直角坐標系,有n個點,每一個點必須向某一個方向發射射線,且任意一條射線必須與某一條坐標軸平行.定義一種發射射線的方案是合法的,則方案必須滿足: 1.沒有一條射線交叉 2.沒有一條射線 ...

  5. 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)

    题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...

  6. 五校联考R1 Day2T2 矩阵matrix(容斥)

    题目链接 容易想到容斥,但是很恶心,因为要对行和列都容斥,然后行+列又要容斥.. 于是得到\(O(nm\log)\)的做法. 就有70分了: #include <cstdio> #incl ...

  7. 五校联考模拟赛Day2T2矩阵(容斥原理)

    题意 $n * m$的网格,对其进行黑白染色,问每一行每一列至少有一个黑格子的方案数. Sol 考场上只会$n^3$的dp,还和指数级枚举一个分qwq 设$f[i][j]$表示到了第$i$行,已经有$ ...

  8. NOIP2016提高A组五校联考4总结

    坑爹的第一题,我居然想了足足3个小时,而且还不确定是否正确. 于是,我就在这种情况下心惊胆跳的打了,好在ac了,否则就爆零了. 第二题,树形dp,本来差点就想到了正解,结果时间不够,没打完. 第三题, ...

  9. 【NOIP2016提高A组五校联考4】square

    题目 分析 首先,设\(f_{i,j}\)表示最大的以(i,j)为左下角的正方形的边长. 转移显然,\(f_{i,j}=\max(f_{i-1,j},f_{i,j-1},f_{i-1,j-1})+1\ ...

随机推荐

  1. Java-Class-C:java.util.ArrayList

    ylbtech-Java-Class-C:java.util.ArrayList 1.返回顶部 1.1. import java.util.ArrayList;import java.util.Lis ...

  2. ashx后门[转]

    https://www.cnblogs.com/Fluorescence-tjy/p/9855828.html 一.标准ASPX一句话木马 .NET平台下的一句话木马则百年不变,最常见的当属下面这句 ...

  3. !!!myeclipse 上加载本地图片问题,无法加载问题

    出现无法加载本地图片的问题, 原因就是把图片放到了本地项目中的image了,但是myeclipse上没有刷新 这样以后 本地的图片比在线的要快 低级错误,诶!

  4. 关于合并pdf文件出现的问题

    输出端出现以下问题: PdfReadWarning: Xref table not zero-indexed. ID numbers for objects will be 解决方案: import ...

  5. .net 超链接传值,传过去始终是null

    今天做了一个删除功能,通过点击列表中的删除超链接,通过get请求,跳转到一个处理程序执行删除操作 . 因为不熟悉各种报错 , <%="<td> <a class='d ...

  6. LA 3263 /// 欧拉定理 oj21860

    题目大意: n个端点的一笔画 第n个和第1个重合 即一笔画必定是闭合曲线 输出平面被分成的区域数 欧拉定理 V+F-E=2 即 点数+面数-边数=2 (这里的面数包括了外部) #include < ...

  7. HTML5的特殊标签与IE浏览器的兼容

    注释标签 ruby: 行级元素 横排显示 试图写多个汉字和注释,需要多个ruby. 直接上代码: - css样式: 页面效果: 重点标记 mark: 以灰常黄的黄色来重点标记 页面代码: 类似于进度条 ...

  8. 《创新者》读书笔记 PB16110698 第五周(~4.5)

    本周我阅读了某同学推荐的<创新者>,这本书实际上是两个世纪以来信息技术的编年史,从巴贝奇的差分机到如今互联网时代的超级计算机,作者通过各个时代里一位位杰出的创新者,将计算机诞生.发展.崛起 ...

  9. c++11 Thread库写多线程程序

    一个简单的使用线程的Demo c++11提供了一个新的头文件<thread>提供了对线程函数的支持的声明(其他数据保护相关的声明放在其他的头文件中,暂时先从thread头文件入手吧),写一 ...

  10. EXCEL表格链接SQLSEVER数据库

    Sub 数据库连接()     Set Cnn = CreateObject("ADODB.Connection")    Set rs = CreateObject(" ...