2.2.1755&2.3.1760
斐波那契数列的递归与递推
2.3.1760
描述
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面(2)个数之和。
给出一个正整数a,要求菲波那契数列中第(a)个数对(1000)取模的结果是多少。
输入
第(1)行是测试数据的组数(n),后面跟着(n)行输入。每组测试数据占(1)行,包括一个正整数(a)((1 leq a leq 10^6))。
输出
(n)行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第(a)个数对(1000)取模得到的结果。
样例输入
4
5
2
19
1
样例输出
5
1
181
1
分析:数据规模大,而且有取模运算,可以使用数组
((TLE)了因为递归规模太大改用递推)
(AC)代码
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#define K 1000
using namespace std;
int f[1000005],y=0;
int main(){
scanf("%d",&y);
// printf("yy%d
",y);
f[1]=1;f[2]=1;
for(int i=3;i<=1000005;i++){
f[i]=(f[i-1]%K+f[i-2]%K)%K;
}
while(y--){
// printf("i %d 3
",y);
int a;
scanf("%d",&a);
printf("%d
",f[a]);
}
return 0;
}
为啥本地编译的时候初始值(y=4)之后突然变成(y=130)呢...奇怪
2.2.1755
描述
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数(a),要求菲波那契数列中第(a)个数是多少。
输入
第1行是测试数据的组数(n),后面跟着(n)行输入。每组测试数据占1行,包括一个正整数(a)((1 leq a leq 20))
输出
输出有(n)行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第(a)个数的大小
样例输入与输出
同上
分析:数据规模小,可以递推
AC代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
#define K 1000
int m(int p){
if(p==1) return 1;
if(p==2) return 1;
else return m(p-1)+m(p-2);
}
int main(){
memset(a,0,sizeof(a));
scanf("%d",&n);
while(n--){
int a;
scanf("%d",&a);
printf("%d",m(a));
printf("
");
}
return 0;
}