题目描述
Pell数列a_1,a_2,a_3,...a_1,a_2,a_3,...的定义是这样的,a_1=1,a_2=2,...,a_n=2a_n−1+a_n−2(n>2)a_1=1,a_2=2,...,a_n=2a_n−1+a_n−2(n>2)。
给出一个正整数 kk,要求Pell数列的第 kk 项模上 3276732767 是多少。
输入
第1行是测试数据的组数 nn,后面跟着 nn 行输入。每组测试数据占 11 行,包括一个正整数k(1≤k<1000000)k(1≤k<1000000)。
输出
nn 行,每行输出对应一个输入。输出应是一个非负整数。
样例
输入数据 1
2
1
8
Copy
输出数据 1
1
408
Copy
来源
一本通在线评测
C
#include <stdio.h>
int main() {
int n; // 测试数据的组数
scanf("%d", &n);
int k_values[n]; // 存储每组的 k 值
for (int i = 0; i < n; i++) {
scanf("%d", &k_values[i]); // 读取每组的 k 值
}
int max_k = 0;
for (int i = 0; i < n; i++) {
if (k_values[i] > max_k) {
max_k = k_values[i]; // 找到最大的 k 值
}
}
int pell[max_k + 1]; // 创建一个数组来存储 Pell 数列
pell[1] = 1; // 第 1 项
pell[2] = 2; // 第 2 项
// 计算 Pell 数列的值
for (int i = 3; i <= max_k; i++) {
pell[i] = (2 * pell[i - 1] + pell[i - 2]) % 32767; // 使用模 32767
}
// 输出对应的 Pell 数列项
for (int i = 0; i < n; i++) {
printf("%d\n", pell[k_values[i]]);
}
return 0;
}
C++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n; // 测试数据的组数
cin >> n;
vector<int> pell(1000000); // 用于存储 Pell 数列的前 1,000,000 项
pell[1] = 1; // 第 1 项
pell[2] = 2; // 第 2 项
// 计算 Pell 数列的前 1,000,000 项
for (int i = 3; i < 1000000; ++i) {
pell[i] = (2 * pell[i - 1] + pell[i - 2]) % 32767; // 使用模 32767
}
// 处理每组测试数据
while (n--) {
int k;
cin >> k; // 读取 k
cout << pell[k] << endl; // 输出对应的 Pell 数列项
}
return 0;
}
Python、
def pell_numbers(max_k):
pell = [0] * (max_k + 1) # 创建一个数组来存储 Pell 数列
pell[1] = 1 # 第 1 项
pell[2] = 2 # 第 2 项
# 计算 Pell 数列的值
for i in range(3, max_k + 1):
pell[i] = (2 * pell[i - 1] + pell[i - 2]) % 32767 # 使用模 32767
return pell
def main():
n = int(input()) # 读取测试数据的组数
k_values = [int(input()) for _ in range(n)] # 读取每组的 k 值
max_k = max(k_values) # 找到最大的 k 值
pell = pell_numbers(max_k) # 计算 Pell 数列
# 输出对应的 Pell 数列项
for k in k_values:
print(pell[k])
if __name__ == "__main__":
main()