斐波那契数列(取模)
题目:
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。
输入
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1 <= a <= 1000000)。
输出
n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数对1000取模得到的结果。
1.递归
#include<iostream> #include<cstdio> using namespace std; long long dfs(int i) { if(i==1) return 1; if(i==2) return 1; return dfs(i-2)+dfs(i-1); } int main() { int n,s,a; cin>>n; for(int i=1;i<=n;i++) { cin>>a; s=dfs(a); cout<<s%1000<<endl; } return 0; }
2.记忆化搜索
#include<iostream> #include<cstdio> using namespace std; long long f[60]; long long dfs(int i) { if(i==1) return f[1]=1; if(i==2) return f[2]=1; if(f[i]>0) return f[i]; return f[i]=(dfs(i-1)+dfs(i-2))%1000; } int main() { long long n,a; cin>>n; for(int i=1;i<=n;i++) { cin>>a; cout<<dfs(a)<<endl; } return 0; }
3.递推
#include<iostream> #include<cstdio> //#define maxsize 1000005 int a[1000010]; using namespace std; int main() { int n,s; a[1]=a[2]=1; for(int i=3;i<=1000010;i++) { a[i]=a[i-1]+a[i-2]; a[i]%=1000; } cin>>n; for(int i=1;i<=n;i++) { cin>>s; cout<<a[s]<<endl; } return 0; }