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