牡牛和牝
N只牛排成一排,每只为牡牛或牝牛,要求任意两
正文
/*
原题:T1652「一本通 6.6 练习 1」牡牛和牝
题意:N 只牛排成一排,每只为牡牛或牝牛,要求任意两只牡牛之间至少有 K 只牝牛,
求排队方法数对 5000011 取模的结果。
思路:设 f[i] 为长度 i 的合法方案数。末位放牝牛有 f[i-1] 种;
末位放牡牛时,它前面 K 位必须都是牝牛,于是前 i-K-1 位可以是任意合法串。
若 i≤K 则不存在更早的牡牛,只有「全是牝牛加末尾一头牡牛」这 1 种。
复杂度:时间 O(N),空间 O(N)
易错点:1) i≤K 时这一项取 1 而不是 f[i-K-1](下标为负);
2) 空串也算一种(f[0]=1),它对应「只有一头牡牛」的情形;
3) 每步取模,防止结果溢出。
*/
#include <bits/stdc++.h>
using namespace std;
const long long MOD=5000011;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
long long N;
int K;
cin>>N>>K;
vector<long long> f(N+1,0);
f[0]=1;
for(long long i=1;i<=N;i++){
long long add;
if(i>=K+1){
add=f[i-K-1];
}else{
add=1;
}
f[i]=(f[i-1]+add)%MOD;
}
cout<<f[N]<<"\n";
return 0;
}
一本通·提高篇的其它内容
- 活动安排
- 种树
- 喷水装置
- 加工生产调度
- 智力大冲浪
- 数列极差
- 数列分段
- 线段
- 家庭作业
- 钓鱼
- 糖果传递
- 愤怒的牛
- Best Cow Fences
- 曲线
- 数列分段 II
- 扩散
- 灯泡
- 传送带
- 数的划分
- 生日蛋糕
- 小木棍
- Addition Chains
- 埃及分数
- 平板涂色
- 质数方阵
- 靶形数独
- 电路维修
- 魔板
- Knight Moves
- 棋盘游戏
- Keyboarding
- 移动玩具
- 山峰和山谷
- Oulipo
- 图书管理
- Power Strings
- Seekthe Name, Seek the Fame
- Friends
- A Horrible Poem
- Beads
- Antisymmetry
- 门票
- 收集雪花
- 剪花布条
- Power Strings
- Radio Transmission
- OKR-Periods of Words
- 似乎在梦中见过的样子
- Censoring
- Phone List
- The XOR Largest Pair
- Nikitosh 和异或
- Immediate Decodability
- L 语言
- Secret Message 秘密信息
- 背单词
- The Xor-longest Path
- Keywords Search
- 玄武密码
- Censoring