zoukankan      html  css  js  c++  java
  • 51nod 1119 组合数,逆元

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1119

    1119 机器人走方格 V2

    基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
    收藏
    关注
    M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。
     
    Input
    第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000000)
    Output
    输出走法的数量 Mod 10^9 + 7。
    Input示例
    2 3
    Output示例
    3
    一个很经典的题目,最开始做是用dp推导,但是当数据很大的时候就不行了,考虑用组合的概念解题;
    N*M的棋盘,左上到右下只能向右下方走,这就固定了行走步数,也就是N+M-2步,其中N-1步是向下走的,M-1步是向右走的,问题就相当于从总步数中挑选N-1步向下走,其他的位置就是向右。
    也就是C(N-1,N+M-2), C(n,r)=(n-r+1)/r*C(n,r-1) ,利用逆元求解。
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define LL long long
     4 LL mod=1e9+7;
     5 LL inv[1000005]={1,1};
     6 int main()
     7 {
     8     LL N,M;
     9     for(LL i=2;i<=1000000;++i)
    10         inv[i]=(mod-mod/i)*inv[mod%i]%mod;
    11     cin>>M>>N;
    12     LL ans=1,n=N+M-2;
    13     for(LL i=1;i<=N-1;++i)
    14         ans=(n-i+1)*inv[i]%mod*ans%mod;
    15     cout<<ans<<endl;
    16     return 0;
    17 }
  • 相关阅读:
    JUC学习
    java反射学习
    JSON入门学习
    redis
    NoSQ学习
    手写Lockl锁
    MapReduce过程
    scala学习
    idea jetty 配置
    java 基础--理论知识
  • 原文地址:https://www.cnblogs.com/zzqc/p/7380408.html
Copyright © 2011-2022 走看看