题目大意:
一只蜜蜂在下图所示的数字蜂房上爬动,已知它只能从标号小的蜂房爬到标号大的相邻蜂房,现在问你:蜜蜂从蜂房
m
m
m 开始爬到蜂房
n
,
m
<
n
n,m<n
n,m<n,有多少种爬行路线?(备注:题面有误,右上角应为
n
−
1
n-1
n−1)
说明/提示:
对于 100 100 100%的数据, 1 ≤ M , N ≤ 1000 1≤M,N≤1000 1≤M,N≤1000。
思路/分析:
n
,
m
n,m
n,m 是输入的蜂房,
t
t
t 是存
n
−
m
n-m
n−m 的,
a
a
a 数组存走法,
p
d
pd
pd 判断输出的最高位是不是
0
0
0。
主函数首先输入
m
m
m 和
n
n
n,
t
t
t 为
n
−
m
n-m
n−m。特判
0
,
1
,
2
0,1,2
0,1,2 这三个数,因为这
3
3
3 个是已知的。
从
3
3
3 开始循环,一直到
t
t
t,主要的高精代码在前面解释了就不多说了。
然后该输出
n
n
n 的结果了,从
600
600
600 循环到
2
2
2 ,如果该位是
0
0
0 且是最高位,那么不满足数字的要求,就循环下一位,如果该位
!
=
0
!=0
!=0,那么
p
d
pd
pd 变成
1
1
1,证明如果再出现
0
0
0 就不是最高位了,可以输出
0
0
0。
注意:最后的个位是不能在循环里输出的,因为个位比较特殊,如果 n n n 是 0 0 0 的话,按照循环里面的规则的不满足输出数的规律的,所以最后一位放到循环里面的话, n = 0 n=0 n=0 是输出不了正确答案的,所以个位要放循环外面特判,这样就满足了所有的条件,这道题就能过了
代码:
#include <bits/stdc++.h>
using namespace std;
int n,m,t;
bool pd = 0;
int a[1000][1000];
int main(){
cin >> m >> n;
t = n - m;
a[0][1] = 0;
a[1][1] = 1;
a[2][1] = 2;
for(int i = 3;i <= t;i++){
for(int j = 1;j < 600;j++)
a[i][j] = a[i - 1][j] + a[i - 2][j];
for(int j = 1;j < 600;j++){
while(a[i][j] > 9){
a[i][j + 1]++;
a[i][j] -= 10;
}
}
}
for(int i = 600;i > 1;i--){
if(!pd && a[t][i] == 0){
continue;
}
pd = 1;
cout << a[t][i];
}
cout << a[t][1];
return 0;
}