本文分享的必刷题目是从蓝桥云课、洛谷、AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。
欢迎大家订阅我的专栏:算法题解:C++与Python实现!
附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总
【题目来源】
AtCoder:C - K-bonacci (atcoder.jp)
【题目描述】
You are given positive integers
N
N
N and
K
K
K. Define a sequence
A
=
(
A
0
,
A
1
,
…
,
A
N
)
A=(A_0,A_1,…,A_N)
A=(A0,A1,…,AN) of length
N
+
1
N+1
N+1 as follows:
给定两个正整数
N
N
N 和
K
K
K。定义一个长度为
N
+
1
N+1
N+1 的序列
A
=
(
A
0
,
A
1
,
…
,
A
N
)
A=(A_0,A_1,…,A_N)
A=(A0,A1,…,AN) 如下:
- A i = 1 A_i=1 Ai=1 for 0 ≤ i < K 0≤i<K 0≤i<K;
- A i = A i − K + A i − K + 1 + … + A i − 1 A_i=A_{i−K}+A_{i−K+1}+…+A_{i−1} Ai=Ai−K+Ai−K+1+…+Ai−1 for K ≤ i K≤i K≤i.
Find A N A_N AN modulo 1 0 9 10^9 109.
【输入】
The input is given from Standard Input in the following format:
N K
【输出】
Print the answer.
【输入样例】
4 2
【输出样例】
5
【算法标签】
《AtCoder AT_abc401_c K-bonacci》 #前缀和#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
#define int long long // 使用长整型
const int N = 1000005; // 定义最大数组大小
const int mod = 1e9; // 定义模数
int n, k; // n-总台阶数,k-每次最多跳跃的台阶数
int a[N]; // a[i]表示跳到第i个台阶的方案数
int sa[N]; // sa[i]是a数组的前缀和数组
signed main() {
cin >> n >> k; // 输入总台阶数和最大跳跃数
// 初始化前k个台阶的方案数(每个台阶初始有1种方式)
for (int i = 1; i <= k; i++) {
a[i] = 1;
sa[i] = (sa[i-1] + a[i]) % mod; // 计算前缀和
}
// 动态规划计算k+1到n+1台阶的方案数
for (int i = k + 1; i <= n + 1; i++) {
// 当前台阶的方案数 = 前i-1个台阶的和 - 前i-k-1个台阶的和
a[i] = (sa[i-1] - sa[i-k-1] + mod) % mod;
// 更新前缀和数组
sa[i] = (sa[i-1] + a[i]) % mod;
}
cout << a[n+1] << endl; // 输出跳到第n+1个台阶的方案数
return 0;
}
【运行结果】
4 2
5