数列(C++)

用以下方式构造数列: 数列的第一个和第二个数都为 1,接下来每个数都等于前
面 2 个数之和。
给出一个正整数 a,要求数列中第 a 个数对 1000 取模的结果是多少。
输入:第 1 行是测试数据的组数 n,后面跟着 n 行输入。每组测试数据占 1 行,
包括一个正整数 a(1 <= a <= 1000000)。
输出:n 行,每行输出对应一个输入。输出应是一个正整数,为数列中第 a 个数
对 1000 取模得到的结果。
样例输入
4
5
2
19
1
样例输出
5
1
181

方法一:

使用A数组对所有结果进行储存,然后对所需的项目进行输出。

#include <bits/stdc++.h>//万能头 
using namespace std;
int a[1000010];//数组往大开,这是个好习惯 
int main()
{
	a[1]=1;
	a[2]=1;//按题目进行初始化
	for(int i=3;i<=1000000;i++)
		a[i]=(a[i-1]+a[i-2])%1000;//第a[i]项=a[i-1]+a[i-2],别忘了取模!!! 
	int n,t;//N表示共有多少组数据 
	cin>>n; 
	for(int i=1;i<=n;i++)
	{
		cin>>t;
		cout<<a[t]<<endl;
	} 
	return 0;
}

注意:别忘了取模。虽然简单,但容易TLE

导致作者差一点AC


方法二:

用A数组对每个测试点进行储存,然后找出最大的测试点,用MAX进行储存,只运行到a[max]即可

可以省时间,以免TLE

#include <bits/stdc++.h>//万能头 
using namespace std;
int a[1000010];//数组大小看要求 
int b[1000010];//存答案的 
int main()
{
	int n,max=0;
	cin>>n;
	for(int i=1;i<=n;i++) 
	{
		cin>>a[i];
		if(a[i]>max) max=a[i];
	}//输入+找最大值 
	b[1]=1;
	b[2]=1;//换汤不换药,还是熟悉的初始化
	for(int i=3;i<=max;i++)
		b[i]=(b[i-1]+b[i-2])%1000;//还是熟悉的取模
	for(int i=1;i<=n;i++)
		cout<<b[a[i]]<<endl;//输出答案的第a[i]项 
	return 0;
}

注意:别忘了取模!!!!!!!!!!

敢忘掉你试试


希望以上两种方法能帮助你们顺利AC!!有问题可以在评论区交流

验证方法:洛谷B2064 斐波那契数列提交的话要去除取模的过程

如果你能关注新人煮波,那么我觉得这件事太酷了

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值