复试机试练习题【枚举+模拟07】:递推数列

枚举和模拟

07 递推数列

描述

给定 a0,a1以及 an=p×a(n−1)+q×(an−2) 中的 p,q

这里 n≥2

求第 k 个数 ak 对 10000 的模。

输入格式

输入包括 55 个整数:a0、a1、p、q、k

输出格式

第 k 个数 ak 对 10000 的模。

数据范围

1≤a0,a1,p,q,k≤10000

输入样例

20 1 1 14 5

输出样例

8359

解答

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
using namespace std;


//原始版 超时了 因为每一次都是实打实算的
long Digui(int a0, int a1, int p, int q, int k) {
	//a0和a1是常数
	if (k == 0) {
		return a0;
	}
	if (k == 1) {
		return a1;
	}
	//an=p×a(n−1)+q×(an−2)
	return((p * Digui(a0, a1, p, q, k - 1) + q * Digui(a0, a1, p, q, k - 2))%10000);
}

//改进版 已经计算过的值 可以保存下来 而不必每一次都从头算
long Digui2(int a0, int a1, int p, int q, int k) {
	static long memo[10000] = {0}; // 创建一个备忘录数组  
	if (k == 0) {
		return a0;
	}
	if (k == 1) {
		return a1;
	}
	if (memo[k] != 0) { // 如果备忘录中已经计算过该值,直接返回结果  
		return memo[k];
	}
	memo[k] = (p * Digui2(a0, a1, p, q, k - 1) + q * Digui2(a0, a1, p, q, k - 2))%10000; // 否则计算该值并保存到备忘录中  
	return memo[k];
}



int main() {
	
	//递推公式
	//an=p×a(n−1)+q×(an−2)


	//先判断k是多少 
	//k为0或1 就可以直接输出 k是更大的 再使用递推公式

	//接受用户输入
	//a0、a1、p、q、k
	int a0,a1,p,q,k;
	scanf("%d %d %d %d %d", &a0, &a1, &p, &q, &k);
	
	printf("%d", Digui2(a0, a1, p, q, k)%10000);
	
	return 0;
}
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值