棋盘路径

题目

题目描述

像南京这样的213城市,天气总是不太友好
周三下午是模电实验课,xy正打算从宿舍$(0,0)$去实验楼$(n,m)$上课,然而他突然发现,由于暴雨的缘故,有$k$个路口$(x,y)$已经被水淹没(不知所措),根本过不了人
xy行走的路线很特别,必须满足

  1. 一定平行于坐标轴
  2. 只能在横纵坐标都是整数的点改变方向
  3. 行走过程中横坐标和纵坐标始终不减小
    现在有xy想知道有多少条满足条件的路线可以避开被淹没的路口到达实验楼

    输入格式

    第$1$行是两个非负整数$n$和$m$,表示实验楼的坐标
    第$2$行是一个正整数$k$,表示有$k个路口被淹没
    接下来$k$行,每行有两个非负整数$x$和$y$,表示$(x,y)$这个路口已被淹没

    输出格式

    仅一行,一个非负整数,为满足条件的路线数对$1000000007$取模的值

    样例

    样例输入

    1 1
    0

    样例输出

    2

    数据范围与提示

    对于$30%$的数据,满足$0\leqslant n,m\leqslant 1000,0\leqslant k\leqslant 100$
    对于$70%$的数据,满足$0\leqslant n,m\leqslant 100000,0\leqslant k\leqslant 100$
    对于$100%$的数据,满足$0\leqslant n,m\leqslant 100000,0\leqslant k\leqslant 3000$

    题解

    又是一道沙雕题……又只有我这个沙雕错了
    先将所有被淹没的路口排序,排序后进行容斥
    就是用总路径数减掉前面所有的被淹没的路口到这个被淹没的路口的路径数乘以前面那个被淹没的路口的路径数(容斥完的路径数)
    思路极易理解
    附上代码:
    #include<algorithm>
    #include<iostream> 
    #include<cstdio>
    using namespace std;
    struct ppap
    {
     int x,y;
    }q[200010];
    int n,m,k;
    long long MOD=1e9+7,f[200010],jc[200010],ny[200010];
    int cmp(const ppap &a,const ppap &b)
    {
     return (a.x<b.x||(a.x==b.x&&a.y<b.y));
    }
    long long POW(long long a,long long b)
    {
     long long ans=1; 
     for(;b;b>>=1){
         if(b&1) ans=ans*a%MOD;
         a=a*a%MOD;
     }
     return ans;  
    }
    long long C(int n,int m)
    {
     if(m<0||m>n||n<0) return 0;
     return jc[n]*ny[m]%MOD*ny[n-m]%MOD;
    }
    long long way(int x1,int y1,int x2,int y2)
    {
     return C(x2-x1+y2-y1,x2-x1);
    }
    int main()
    {
     jc[0]=1;
     for(int i=1;i<200005;i++) jc[i]=jc[i-1]*i%MOD; 
     ny[200004]=POW(jc[200004],MOD-2); 
     for(int i=200003;i>=0;i--) ny[i]=ny[i+1]*(i+1)%MOD;
     scanf("%d%d%d",&n,&m,&k); 
     for(int i=1;i<=k;i++) scanf("%d%d",&q[i].x,&q[i].y); 
     sort(q+1,q+k+1,cmp);
     q[++k].x=n,q[k].y=m,f[0]=1;
     for(int i=1;i<=k;i++){
         f[i]=way(0,0,q[i].x,q[i].y);
         for(int j=1;j<i;j++) f[i]=(f[i]-f[j]*way(q[j].x,q[j].y,q[i].x,q[i].y)%MOD+MOD)%MOD; 
     }
     printf("%lld",f[k]);
    }

喜欢的话,给博主赏一杯冰阔乐吧~


  转载请注明: Maserhe 棋盘路径

 上一篇
拜访女神 拜访女神
题目题目描述 TRT出国后,想找一个好的位置住下来。而他所在的城市,恰好有N栋建筑(从$1\sim n$编号),他会选择这些建筑的某一个居住而建筑之间,有$M$条双向路相连。每条道路有一个起始点$u$,终止点$v$,以及走过这条道路所需的时
2020-04-27
下一篇 
洛谷P4155  国旗计划 洛谷P4155 国旗计划
题目题目描述 A国正在开展一项伟大的计划——国旗计划这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了$n$名优秀的边防战士作为这项计划的候选人A国幅员辽阔,边境线上设
2020-04-22
  目录