题目链接:https://www.luogu.com.cn/problem/P1990?contestId=28768
一开始先打表找规律
n | 0 | 1 | 2 | 3 | 4 | 5 | … | n |
---|---|---|---|---|---|---|---|---|
覆盖方法 | 1 | 1 | 2 | 5 | 11 | 24 | … | f[i-1] + f[i-2] + 2*sum[i-3] |
emmm,无意中发现递推公式是
其中sum[i-3]表示前i-3项的前缀和
#include <iostream>
using namespace std;
const int N = 1e6 + 5;
int f[N] = {1, 1, 2, 5};
int sum[N] = {1, 2, 4, 9};
int main(void)
{
int n;
cin >> n;
for (int i = 4; i <= n; i++){
f[i] = (sum[i - 1] + sum[i - 3]) % 10000;
sum[i] = (sum[i - 1] + f[i]) % 10000;
}
cout << f[n] << endl;
return 0;
}