问题 A: 【一本通提高组合数学】Bullcow 牡牛和牝牛

这道题明显是组合数的题目,但对于组合数的考察还是比较灵活,网上有一篇博客里讲的比较清楚

//此题还是比较灵活,对于组合数模型的转化最为重要 
#include<stdc++.h>
using namespace std;
int n,k;
long long mod=5000011;
long long ksm(long long a,long long b){
    long long base=1;
    while(b){
        if(b&1) base=base*a%mod;
        b>>=1;
        a=a*a%mod;
    }
    return base;
}
long long C(long long n,long long m){
    if(m>n) return 0;
    long long a=1,b=1;
    for(long long i=n-m+1;i<=n;i++){
        a=a*i%mod;
    } 
    for(long long i=1;i<=m;i++){
        b=b*i%mod;
    }
    return a*ksm(b,mod-2)%mod;
} 
long long Lucas(long long n,long long m){
    if(!m) return 1;
    else return (C(n%mod,m%mod)*Lucas(n/mod,m/mod))%mod;
} 
long long ans;
int num;
int main(){
    scanf("%d%d",&n,&k);
    ans=1;//牡牛一个也没有 
    for(int i=1;i<=n;i++){//枚举牡牛的数量 
        num=n-(i-1)*k;
        if(i>num) break;
        ans=(ans+Lucas(num,i))%mod;//累加答案 
    }
    printf("%lld\n",ans);
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/LJB666/p/11010027.html