题目大意:
给你两个数 n n n 和 k k k,你要根据 k k k 求出序列 a a a,求 a n a_n an。
a i a_i ai 的计算方式:
考虑递推加前缀和优化, s i s_{i} si 表示 a a a 前 i i i 项和,处理 0 ≤ i < k 0\le i < k 0≤i<k的时候每次把 s i s_i si 赋值成 s i − 1 + 1 s_{i-1}+1 si−1+1。
处理到 k ≤ i k\le i k≤i 时:先把 s i s_i si 赋值成 s i − 1 s_{i-1} si−1,如果 i = k i=k i=k 就代表 a i a_i ai 就是前面所有数的和,直接加上 s i − 1 s_{i-1} si−1。 i ≠ k i \ne k i=k 就是 s i − 1 − s i − k − 1 s_{i-1}-s_{i-k-1} si−1−si−k−1。
最后 s n − s n − 1 s_n-s_{n-1} sn−sn−1 就是 a i a_i ai。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MOD=1e9;
int n,k;
int s[1000005];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>k;
for(int i=0;i<k;i++)
{
s[i]=s[i-1]+1;
s[i]%=MOD;
}
if(k>n)
{
cout<<1;
return 0;
}
for(int i=k;i<=n;i++)
{
s[i]+=s[i-1]+s[i-1];
if(i!=k)
{
s[i]-=s[i-k-1];
}
s[i]%=MOD;
}
cout<<(s[n]-s[n-1]+MOD)%MOD;
return 0;
}