zoukankan      html  css  js  c++  java
  • 51nod 1486 大大走格子(DP+组合数学)

      枚举不合法点的思想。

      把障碍x坐标为第一关键字,y坐标为第二关键字排序。f[i]表示走到第i个障碍的方案数。

      f[i]=C(x[i]+y[i]-2,x[i]-1)-sigma(f[j]*C(x[i]-x[j]+y[i]-y[j],x[i]-x[j]));

      然后把终点当成障碍加进去,f[n]为答案。

    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<cstdio>
    #include<algorithm>
    #define MOD(x) x>=mod?x-mod:x
    using namespace std;
    const int maxn=500010,mod=1e9+7;
    struct poi{int x,y;}a[maxn];
    int h,w,n;
    int fac[maxn],f[maxn],inv[maxn];
    void read(int &k)
    {
        int f=1;k=0;char c=getchar();
        while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
        while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar();
        k*=f;
    }
    bool cmp(poi a,poi b){return a.x==b.x?a.y<b.y:a.x<b.x;}
    int power(int a,int b)
    {
        int t=1;
        for(;b;a=1ll*a*a%mod,b>>=1)
        if(b&1)t=1ll*t*a%mod;
        return t;
    }
    int C(int n,int m){return 1ll*fac[n]*inv[m]%mod*inv[n-m]%mod;}
    int main()
    {
        read(h);read(w);read(n);
        for(int i=1;i<=n;i++)read(a[i].x),read(a[i].y);
        a[++n].x=h;a[n].y=w;sort(a+1,a+1+n,cmp);
        fac[0]=inv[0]=1;for(int i=1;i<=h+w;i++)fac[i]=1ll*fac[i-1]*i%mod;
        for(int i=1;i<=h+w;i++)inv[i]=power(fac[i],mod-2);
        for(int i=1;i<=n;i++)
        {
            f[i]=C(a[i].x+a[i].y-2,a[i].x-1);
            for(int j=1;j<i;j++)
            if(a[j].x<=a[i].x&&a[j].y<=a[i].y)
            f[i]=MOD(1ll*f[i]-1ll*f[j]*C(a[i].x-a[j].x+a[i].y-a[j].y,a[i].x-a[j].x)%mod+mod);
        }
        printf("%d
    ",f[n]);
    }
    View Code
  • 相关阅读:
    WebDriver Api
    Web系统基础
    python自动化测试相关资料
    持续集成Jenkins
    Git和Github库详细使用教程
    TCP/UDP协议
    CentOS连接网络设置
    Web测试基本思路:UI测试、功能测试和兼容性测试
    初识Jenkins
    selenium +python 对table的操作
  • 原文地址:https://www.cnblogs.com/Sakits/p/7570215.html
Copyright © 2011-2022 走看看