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;
    }

  • 相关阅读:
    OpenMP vs WinSxS
    JIT, dynarec and binary translation
    VC++2010 bug
    控制和释放共享内存块
    分配和释放信号量
    代码列表5.1 (shm.c) 尝试共享内存
    绑定和脱离
    信号量
    每个字段动态添加一个随机数
    最近做了一个红底鞋类电商网站
  • 原文地址:https://www.cnblogs.com/zzqc/p/7207286.html
Copyright © 2011-2022 走看看