【代码+详解】算法题 : Pell数列

❗❗❗必看:
下列题我全部都使用 Java 语言写的,并且均可以提交成功,获得Accepted 结果的. 如果代码和详解看了之后,对答案有任何疑问,都可以在评论区提出来,我都会一个一个回答.

❗❗❗感谢大家的支持,如果喜欢我的博客,关注 点赞 收藏 评论一波,非常感谢!!!

题目:Pell数列

Pell数列a(1), a(2), a(3), …的定义是这样的,a(1) = 1, a(2) = 2, … , a(n) = 2 * a(n − 1) + a(n - 2) (n > 2)。
给出一个正整数k,要求Pell数列的第k项模上32767是多少。

Input

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

Output

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


样例测试

输入

2
1
8

输出

1
408


代码

import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		int n = scanner.nextInt();//输入的组数
	
		
		final int MOB =  32767;//模长
		
		int maxK = 1000000;//最大项数
		
		int[] pells = new int[maxK+1];//可以包含1-k
		
		//初始化前两项
		pells[1] = 1;
		pells[2] = 2;
		
		//预计算pells数列,并把结果保存起来,利用公式计算
		for(int i = 3;i<=maxK;i++) {
			 pells[i] = (2 * pells[i - 1] + pells[i - 2]);
		}
		
		//存储结果的数组
		int[] results = new int[n];
		
		for(int i = 0;i<n;i++) {
			int k = scanner.nextInt();
			results[i] = pells[k]%MOB;
		}
		
		// 输出每组数据的结果
        for (int result : results) {
            System.out.println(result);
        }
		
		// 关闭扫描器
        scanner.close();
	}
}

初步思路

通过预先计算Pell数列的所有项并存储在数组中,查询时直接返回对应结果,这样能快速处理大量查询。

具体步骤

  1. 读取输入数据

    • 使用 Scanner 读取输入的组数 n 和每组数据中的正整数 k。
  2. 定义常量和数组

    • 定义模数 MOD 为 32767。
    • 确定最大可能的 k 值为 1000000。
    • 创建一个大小为 maxK + 1 的数组 pells 来存储Pell数列的各项。
  3. 初始化前两项

    • 根据Pell数列的定义,初始化 pells[1] 为 1,pells[2] 为 2。
  4. 预计算Pell数列

    • 使用递推公式 a(n) = 2 * a(n - 1) + a(n - 2) 计算从第3项到第 maxK 项的Pell数列,并取模存储结果。
  5. 处理每组输入

    • 创建一个数组 results 用于存储每组输入的结果。
    • 对于每组输入的 k,直接从预计算的 pells 数组中取出第 k 项,并对结果取模后存入 results 数组。
  6. 输出结果

    • 遍历 results 数组并输出每个结果。

总结方法

通过预计算并存储所有可能的Pell数列项,在查询时可以快速返回结果,极大地提高了效率。利用数组缓存计算结果避免重复计算,同时通过模运算控制数值范围。这种方法适用于需要多次快速查询的动态规划问题。

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值