zoukankan      html  css  js  c++  java
  • HDU 5698 大组合数取模(逆元)

    瞬间移动

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 1215    Accepted Submission(s): 600


    Problem Description
    有一个无限大的矩形,初始时你在左上角(即第一行第一列),每次你都可以选择一个右下方格子,并瞬移过去(如从下图中的红色格子能直接瞬移到蓝色格子),求到第n行第m列的格子有几种方案,答案对1000000007取模。

     
    Input
    多组测试数据。

    两个整数n,m(2n,m100000)
     
    Output
    一个整数表示答案
     
    Sample Input
    4 5
     
    Sample Output
    10
     还是搞不懂那个递推式怎么正确的推出来的,我是自己手推发现像杨辉三角也就是组合数,多试几次得出规律,
    对于n,m,ans=C(n+m-4,m-2),现在的问题就是n最大10w,C(N,M)=N!/(M!*(N-M)!),由于除法再加上模大质数,想到了逆元
    这里有一个更方便推得式子 C(N,M)%MOD={(N-M+1)/(M)*C(N,M-1)}%MOD=(N-M+1)*inv[M]*C(N,M-1)%MOD;
    #include<bits/stdc++.h>
    using namespace std;
    #define LL long long
    #define MOD 1000000007
    LL inv[100005]={1,1};
    int main()
    {
        int N,i,M,j,k;
        for(i=2;i<=100000;++i) inv[i]=(MOD-MOD/i)*inv[MOD%i]%MOD;
        while(scanf("%d%d",&N,&M)==2) {
            int n=N+M-4,m=M-2;
            LL ans=1;
            for(i=1;i<=m;++i){
                ans=(n-i+1)*inv[i]%MOD*ans%MOD;
            }
            printf("%lld ",ans);
        }
        return 0;
    }

  • 相关阅读:
    EasyUI学习笔记之panel
    下载百度上的图片C#——输入名字就可以下载
    【转--- 数据挖掘的心得学习】
    美团推荐算法实践
    spring零配置AOP踩坑指南
    Spring学习笔记(一)
    工具类--生成随机姓名及指定长度随机字符串
    Mybatis中文模糊查询,数据库中有数据,但无结果匹配
    mybatis笔记
    code forces Watermelon
  • 原文地址:https://www.cnblogs.com/zzqc/p/7207286.html
Copyright © 2011-2022 走看看