P8784 题解

洛谷P8784 题解

题目

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 同上。

注意

  1. 不要开 long long,否则会 MLE!
  2. 因为每一个数最大都是 10^9,所有每加两个数,就“合并”成一个数(也就是 mod 1000000007),否则会 WA!
  3. mod不要弄错,是 1 后面 8 个 0 然后后面有一个 7(即1000000007)!
  4. 不要忘记初始化(即 10 到 15 行),否则会 WA!
  5. 用我的方法,不要忘记调用填充递推数组得函数(第 25 行),否则会 WA!
  6. 等等
  7. 没了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值