• 51 Nod 1119


    机器人走方格 V2

    M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。

    Input

    第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000000)

    Output

    输出走法的数量 Mod 10^9 + 7。

    Sample Input

    2 3

    Sample Output

    3

    解析 我们可以推出(i行j列的走法)dp[i][j]=dp[i][j-1]+dp[i-1][j],又可以推出(i-j行j列的走法)p[i][j] = dp[i-j][j]=dp[i-j-1][j]+dp[i-j][j-1]=p[i-1][j]+r[i-1][j-1]
    p[i][j]=p[i-1][j]+p[i-1][j-1] 即组合数公式 C(n-1+m-1,n-1) 数据过大要求取模 除法不能取模 要求逆元 完成解答。
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <algorithm>
    #include <set>
    #include <queue>
    
    using namespace std;
    
    const int mod = 1000000007;
    const int MAXN = 1000000;
    long long f[MAXN * 2 + 10];
    int n,m;
    
    void init()
    {
        f[0] = 1;
        f[1] = 1;
        for(int i = 2; i <= 2000000; i++)
            f[i] = (f[i - 1] * i) % mod;
    }
    long long pow(long long n,long long m)
    {
        long long ans = 1;
        while(m > 0)
        {
            if(m & 1)ans = (ans * n) % mod;
            m = m >> 1;
            n = (n * n) % mod;
        }
        return ans;
    }
    long long computer()
    {
        long long ans = f[n - 1 + m - 1];
        ans = (ans * pow(f[n-1],mod - 2)) % mod;
        ans = (ans * pow(f[m - 1] ,mod - 2)) % mod;
        return ans;
    }
    int main()
    {
        init();
        while(~scanf("%d%d",&n,&m))
        {
            cout<<computer()<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Asp.net web api部署在某些服务器上老是404
    log4net记录日志到数据库自定义字段
    PIE-Basic 投影变换
    PIE-Basic 波段合成
    PIE-Basic 空间量测
    PIE-Basic 存储格式转换
    PIE-Basic 位深转换
    PIE-Basic 数据拉伸与显示
    PIE-Basic数据信息查看
    PIE-Basic 影像格式转换
  • 原文地址:https://www.cnblogs.com/stranger-/p/7350472.html
Copyright © 2020-2023  润新知