洛谷P8784 题解
题目
代码
01. #include <iostream>
02.
03. using namespace std;
04. const int Mod = 1000000007;
05. int N;
06. int Result[10000005];
07. int NoUp[10000005], NoDown[10000005];
08.
09. void FillResult( ) {
10. Result[1] = 1;
11. NoUp[1] = 0;
12. NoDown[1] = 0;
13. Result[2] = 2;
14. NoUp[2] = 1;
15. NoDown[2] = 1;
16. for (int i = 3; i <= 10000000; i++) {
17. Result[i] = ((NoUp[i - 1] + NoDown[i - 1]) % Mod + (Result[i - 1] + Result[i - 2]) % Mod) % Mod;
18. NoUp[i] = (Result[i - 2] + NoDown[i - 1]) % Mod;
19. NoDown[i] = (Result[i - 2] + NoUp[i - 1]) % Mod;
20. }
21. }
22.
23. int main( ) {
24. cin >> N;
25. FillResult( );
26. cout << Result[N] << '\n';
27. return 0;
28. }
关于 Result[X]、NoUp[X]、NoDown[X] 的解释
- 请注意最右边
思路(主要在第17~19行)
17行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dD87O1W1-1671788250194)(img.png)]
- 1 是第一个,2 是第二个,以此类推。
18行和19行
- L18 是第 18 行,L19 是第 19 行,后面的 1、2 同上。
注意
- 不要开
long long
,否则会 MLE! - 因为每一个数最大都是
10^9
,所有每加两个数,就“合并”成一个数(也就是mod 1000000007
),否则会 WA! mod
不要弄错,是 1 后面 8 个 0 然后后面有一个 7(即1000000007
)!- 不要忘记初始化(即 10 到 15 行),否则会 WA!
- 用我的方法,不要忘记调用填充递推数组得函数(第 25 行),否则会 WA!
- 等等
- 没了