菲波那契数列是指这样的数列: 数列的第一个和第二个数都为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\)呢...奇怪
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为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;
}
原文:https://www.cnblogs.com/liuziwen0224/p/11991538.html