10230. 「一本通 6.6 练习 1」牡牛和牝牛
题意
牡 mǔ,畜父也。牝 pìn,畜母也。 ——《说文解字》
约翰要带 N 只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛。牛们要站成一排,但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有 K 只牝牛。请计算一共有多少种排队的方法,所有牡牛可以看成是相同的,所有牝牛也一样,答案对 5000011 取模。
思路
设f_i表示当前第i头牛放牡牛,那么组合数为sum_{i-k 1}。sum_i=sum_{i-1} f_i。最后输出总方案数:sum_n 1
代码语言:javascript复制#include<algorithm>
#include<bitset>
#include<complex>
#include<deque>
#include<exception>
#include<fstream>
#include<functional>
#include<iomanip>
#include<ios>
#include<iosfwd>
#include<iostream>
#include<istream>
#include<iterator>
#include<limits>
#include<list>
#include<locale>
#include<map>
#include<memory>
#include<new>
#include<numeric>
#include<ostream>
#include<queue>
#include<set>
#include<sstream>
#include<stack>
#include<stdexcept>
#include<streambuf>
#include<string>
#include<typeinfo>
#include<utility>
#include<valarray>
#include<vector>
#include<cstring>
using namespace std;
#define MAXE 400010
#define ll long long
inline ll read(){
char ch=getchar();ll res=0,f=1;
while(ch<'0'ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') res=res*10 ch-'0',ch=getchar();
return res*f;
}
void write(ll x){
if(x<0) putchar('-'),x=-x;
if(x<10) putchar(x '0');
else{
write(x/10);
putchar(x '0');
}
}
ll f[100010],sum[100010];
ll n,k;
int main(){
n=read();k=read();
fill(f,f 100001,1);
for(ll i=1;i<=n;i ){
if(i>k){
f[i] =sum[i-k-1];
f[i]%=5000011;
}
sum[i]=sum[i-1] f[i];
sum[i]%=5000011;
}
write(sum[n] 1);putchar('n');
return 0;
}