首页 > 技术文章 > HDU 5894 hannnnah_j’s Biological Test (组合数学) -2016 ICPC沈阳赛区网络赛

Ritchie 2016-09-19 18:44 原文

题目链接

#include <map>
#include <queue>
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
using namespace std;
long long a[1000005];
const long long mod=1000000007;
long long quick(long long a,long long b)
{
    long long ans=1;
    while(b)
    {
        if(b&1) {
            ans=ans*a%mod;
            b--;
        }
        b>>=1;
        a=a*a%mod;
    }
    return ans;
}
int main()
{
    int T;
    long long i,n,m,k;
    a[1]=1;
    for(i=2; i<=1000000; i++)
        a[i]=(a[i-1]*i)%mod;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lld%lld%lld",&n,&m,&k);
        if(m==1)
            printf("%lld\n",n);
        else if(m+m*k>n)
            printf("0\n");
        else if(m+m*k==n)
            printf("%lld\n",k+1);
        else {
            long long y=m-1;
            long long x=n-m*k-1;
            long long ans=a[x]*quick(a[x-y],mod-2)%mod*quick(a[y],mod-2)%mod;
            printf("%lld\n",n*ans%mod*quick(m,mod-2)%mod);
        }
    }
    return 0;
}

 

推荐阅读