Openjudge 2.2-2.3 递归与递推
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\n",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\n",y);
int a;
scanf("%d",&a);
printf("%d\n",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("\n");
}
return 0;
}
要做就做南波万