本文主要是介绍信息学奥赛一本通1188:菲波那契数列(2),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1188:菲波那契数列(2)
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 70272 通过数: 26790
【题目描述】
菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。
给出一个正整数a,要求菲波那契数列中第a个数对1000取模的结果是多少。
【输入】
第11行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a(1≤a≤1000000)。
【输出】
n行,每行输出对应一个输入。输出应是一个正整数,为菲波那契数列中第a个数对1000取模得到的结果。
【输入样例】
4
5
2
19
1
【输出样例】
5
1
181
1
题解
用递推,用b数组记录菲波那契数列的每一位求余1000的值,b1是当前b数组的最高位数,如果当前想要的位数比b数组最高位数还要高的话计算,更新b数组的最高位数,否则直接输出。计算每一位可以用前两位的值求余1000,防止最后结果过大超出int
源代码
#include<bits/stdc++.h>
using namespace std;
int n,a,b[1000001]={-1},b1=2;
int main()
{b[1]=b[2]=1;cin>>n;for(int i=1;i<=n;i++){cin>>a;if(a<=b1){cout<<b[a]<<endl;}else{for(int i=b1+1;i<=a;i++){b[i]=(b[i-1]+b[i-2])%1000;}cout<<b[a]<<endl;b1=a;}}
}
这篇关于信息学奥赛一本通1188:菲波那契数列(2)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!