其实很好推。
自上向下反射,上层可以反射到中层,下层两种情况,中层可以反射到下层一种情况。
自下向上反射,下层可以反射到中层,上层两种情况,中层可以反射到上层一种情况。
这样一推会发现公式满足f[i]=f[i-1]+f[i-2]
其实就是斐波那契数列。
n=1000的时候数比较大,要用大数。
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define MAXN 1005
#define ll long long
using namespace std;
void Add(char a[],char b[],char back[])
{
int l=max(strlen(a),strlen(b))+2;
char *c;
c=(char*)malloc(l*sizeof(char));
int i=strlen(a)-1,j=strlen(b)-1;
int k=0,up=0,x,y,z;
while(i>=0||j>=0)
{
if(i<0) x='0';
else x=a[i];
if(j<0) y='0';
else y=b[j];
z=x-'0'+y-'0';
if(up) z++;
if(z>9)
{
up=1;
z%=10;
}
else up=0;
c[k++]=z+'0';
i--;
j--;
}
if(up) c[k++]='1';
i=0;
c[k]=0;
for(k=k-1; k>=0; --k)
back[i++]=c[k];
back[i]=0;
}
char f[MAXN][MAXN];
int main()
{
strcpy(f[0],"1");
strcpy(f[1],"2");
for(int i=2; i<=MAXN; ++i)
Add(f[i-1],f[i-2],f[i]);
int v;
while(scanf("%d",&v)!=EOF)
printf("%s\n",f[v]);
return 0;
}