#pell数列(openjudge 2.2 1788)

文章介绍了如何使用C++编程解决Pell数列的问题,通过递推公式计算数列的第k项,并对结果取模32767。程序包含特殊处理首两项和按规律预处理的部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
Pell数列a1, a2, a3, ...的定义是这样的,a1 = 1, a2 = 2, ... , an = 2 * an − 1 + an - 2 (n > 2)。
给出一个正整数k,要求Pell数列的第k项模上32767是多少。 

输入

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数k (1 ≤ k < 1000000)

输出

n行,每行输出对应一个输入。输出应是一个非负整数。

递推问题
1.特殊处理无法递推的项(一般都是第1,2项)
2.找规律
3.按规律预处理(看情况,如果项数少就直接预处理)

头文件

#include<iostream>
using namespace std;
int k[1000005];//虽然题目说正整数k的范围是1<=k<=1000000,但咱们可以稍微大方一丢丢,开个1000005
int main();
int n,i,j,s,b;
cin>>n;
k[1]=1;//数列的第一个数字是‘1’
k[2]=2;//数列的第二个数字是‘2’
for(i=3;i<=1000000;i++)//因为数组的第一个和第二个数字已经赋值了,所以i从3开始遍历到1000000
{
    k[i]=(2*k[i-1]+k[i-2])%32767;//数列的第i项是2*(a[i-1]+a[i-2])
	//因为最后要输出pell数列的第k项%32767,所以就直接在这里%32767
}

    for(i=1;i<=n;i++)//输出n行,(非负整数)
	{
    cin>>b;
    cout<<k[b]<<endl;//输出pell数列第k项,因为之前已经处理过了第k项%32767,所以可以直接输出
	}

 所以最后整理一下就可以accept啦

#include<iostream>
using namespace std;
int a[1000005];
int main()
{
	int n,i,j,k,s;
	cin>>n;
	a[1]=1;
	a[2]=2;
	for(i=3;i<=1000000;i++)
	{
		a[i]=(2*a[i-1]+a[i-2])%32767;
	}
	for(i=1;i<=n;i++)
	{
		cin>>k;
		cout<<a[k]<<endl;
	}
	return 0;
}

样例输入                样例输出

2                1
1                408
8
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值