https://www.luogu.org/problem/show?pid=U3357
题目背景
在你成功地解决了上一个问题之后,方方方不禁有些气恼,于是他在楼梯上跳来跳去,想要你求出他跳的方案数。..
题目描述
方方方站在一个n阶楼梯下面,他每次可以往上跳一步或两步,往下跳一步到四步(由于地心引力跳得比较远),而且在往下跳的时候你只能踩在你往上跳时踩过的格子。
现在方方方在楼梯上乱跳,想问他跳到楼梯顶上最后又跳回楼梯下面的方案数mod 2333333。
请注意:针对题目有歧义的情况,这里再说明一下。方方方只能一直向上跳,跳到楼梯最上面,然后再往下跳,跳回楼梯最底下。
输入输出格式
输入格式:
输入一行一个数n。
输出格式:
输出方方方跳回楼梯下面的方案数mod 2333333。
输入输出样例
输入样例#1:
5
输出样例#1:
52
输入样例#2:
7654321
输出样例#2:
451197
输入样例#3:
3
输出样例#3:
8
说明
对于30%的数据,n<=10。
对于100%的数据,1<=n<=10^7。
向下走可以看成向上走
f[i]表示第一次向上走到i,第二次向上也走到i的方案数
如果第二次向上走1步到i,这1步第一次有1种走法
如果第二次向上走2步到i,这2步第一次有2种走法
如果第二次向上走3步到i,这3步第一次有3种走法
如果第二次向上走4步到i,这4步第一次有5种走法
所以状态转移方程:f[i]=f[i-1]+f[i-2]*2+f[i-3]*3+f[i-4]*5
#include<cstdio>
#define N 10000001
#define mod 2333333
using namespace std;
int f[N];
int main()
{
int n;
scanf("%d",&n);
f[]=; f[]=; f[]=; f[]=;
for(int i=;i<=n;i++) f[i]=(f[i-]+f[i-]*+f[i-]*+f[i-]*)%mod;
printf("%d",f[n]);
}