一.题目链接
二.思路
思路参考:https://www.acwing.com/solution/content/48077/
三.代码
#include <iostream>
using namespace std;
const int N = 1e5 + 10, mod = 5000011;
int n, k;
int f[N], s[N];
int main() {
cin >> n >> k;
f[0] = s[0] = 1;
for (int i = 1; i <= n; ++ i) {
f[i] = s[max(i - k - 1, 0)]; //0用来处理所有的负数边界
s[i] = (s[i - 1] + f[i]) % mod;
}
cout << s[n] << endl;
return 0;
}
四.总结
- 该方法可以解决:给定n个物品每种物品分为两类,一类是0,一类是1,让1与1之间至少隔开K个0的方案数。