(File IO): input:problem2.in output:problem2.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
从原点出发,一步只能向右走、向上走或向左走。恰好走
N
N
N步且不经过已走的点共有多少种走法?
输入
一个数字
N
<
=
1000
N<=1000
N<=1000
输出
一个数表示所求答案
m
o
d
12345
mod 12345
mod12345.
样例输入
2
样例输出
7
数据范围限制
解题思路
当
N
N
N确定时,走法的种类是确定的。
设
N
=
n
N=n
N=n时,走法的种类为
A
(
n
)
A(n)
A(n),
则当
N
=
1
N=1
N=1时,
A
(
1
)
=
3
A(1)=3
A(1)=3;当
N
=
2
N=2
N=2时,
A
(
2
)
=
7
A(2)=7
A(2)=7
所以,多推几个可以发现递推关系式:
A
(
n
)
=
2
∗
A
(
n
−
1
)
+
A
(
n
−
2
)
A(n)=2*A(n-1)+A(n-2)
A(n)=2∗A(n−1)+A(n−2)
例如 当
N
=
3
N=3
N=3时,
A
(
3
)
=
2
*
A
(
2
)
+
A
(
1
)
=
2
*
7
+
3
=
17
A(3)=2*A(2)+A(1)=2*7+3=17
A(3)=2*A(2)+A(1)=2*7+3=17
当
N
=
4
N=4
N=4时,
A
(
4
)
=
2
*
A
(
3
)
+
A
(
2
)
=
2
*
17
+
7
=
41
A(4)=2*A(3)+A(2)=2*17+7=41
A(4)=2*A(3)+A(2)=2*17+7=41
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
const int INF=12345;
long long a[1100];
int n;
int main()
{
freopen("problem2.in","r",stdin);
freopen("problem2.out","w",stdout);
scanf("%d",&n);
a[0]=1,a[1]=3;
for(int i=2;i<=n;i++)
a[i]=(a[i-1]*2+a[i-2])%INF;
cout<<a[n];
}