NUC1016 斐波那契数列
时间限制: 1000ms 内存限制: 65536KB
问题描述
“斐波那契数列”的发明者,是意大利数学家列昂纳多?斐波那契(生于公元1170年,籍贯大概是比萨,卒于1240年后)。他还被人称作“比萨的列昂纳多”。1202年,他撰写了《珠算原理》一书。
斐波那契数列衍生于《珠算原理》中的一道题目:
某人把一对兔子放入一个四面被高墙围住的地方。假设每对兔子每月能生下一对小兔,而每对新生小兔从第二个月开始又具备生育能力,请问:一年后应有多少对兔子?
正如丹?布朗对我们所言,答案就是0,1,1,2,3,5,8,13,21,然后可按34,55……一直排列下去。(从第三位起)每位数都是前两位数之和,这是欧洲人所知的第一个此类数列。
斐波那契数数列可表示为0、1、1、2、3... ( N1=0,N2=1 Ni=Ni-1+Ni-2 )
给定i计算斐波那契数列第Ni项最后7位数字.
输入描述
第一行有一个正整数N表示下边有N个情况需要你去计算。
接下来的N行每行有一个正整数i,表示计算第Ni项的最后7位数字。
其中( 1 ≤ i ≤ 1000000 )
输出描述
输出N行计算结果
样例输入
4
5
6
7
10
样例输出
3
5
8
34
问题分析:
对于每次输入的i,若调用一次计算函数,那么重复计算就太多了。所以,打表是必须的。
每一项求的是最后7位数,就用模除,数值就不太大了。
程序说明:
函数setfib()的功能是计算斐波那契数列的各个项,计算结果放入表中。
需要注意元素的个数,定义数组fib[]时,那个“+1”是必要的。
AC的C++程序如下:
#include <iostream> using namespace std; const int MOD = 10000000; const int N = 1000000; int fib[N+1]; void setfib(int n) { fib[1] = 0; fib[2] = 1; for(int i=3; i<=n; i++) fib[i] = (fib[i - 2] + fib[i - 1]) % MOD; } int main() { int n, i; setfib(N); cin >> n; while(n--) { cin >> i; cout << fib[i] << endl; } return 0; }