九度OJ 1081:递推数列 (递归,二分法)

2024-04-02 02:32

本文主要是介绍九度OJ 1081:递推数列 (递归,二分法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:6194

解决:864

题目描述:

给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q。这里n >= 2。 求第k个数对10000的模。

输入:

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

输出:

第k个数a(k)对10000的模。

样例输入:
20 1 1 14 5
样例输出:
8359
来源:
2009年清华大学计算机研究生机试真题

思路:

直接一步一步的递推肯定是要超时的。对这种求第n个数的递推题,有logn的解法。

基本思想是a(n)由a(n/2)得到,逐次循环。

an=p*a(n-1) + q*a(n-2)

可以得到an=p2*a(n-2) + q2*a(n-4)

其中 p2 = (p*p+2*q), q2 = -q*q

这种思想是典型二分法,此题重点是学到了一种解题思想。


代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main(void)
{int p, q, p2, q2, k;long long a0, a1, a2, a3;while (scanf("%lld%lld%d%d%d", &a0, &a1, &p, &q, &k) != EOF){if (k == 0){printf("%lld\n", a0);continue;}a0 %= 10000;a1 %= 10000;p %= 10000;q %= 10000;while (k>1){a2 = p*a1+q*a0;while (a2<0)a2 += 1000000000;a2 %= 10000;if (k%2 == 1){a3 = p*a2+q*a1;while (a3<0)a3 += 1000000000;a3 %= 10000;a0 = a1;a1 = a3;}elsea1 = a2;p2 = (p*p+2*q)%10000;q2 = -q*q;while (q2<0)q2 += 1000000000;q2 %= 10000;p = p2;q = q2;k /= 2;}printf("%lld\n", a1);}return 0;
}
/**************************************************************Problem: 1081User: liangrx06Language: CResult: AcceptedTime:10 msMemory:912 kb
****************************************************************/


别人的代码,用了另一种递归方式,思想是类似的:

#include<stdio.h>
#define MOD 10000
long long a0,a1,p,q,k;
void matrixpow(long long *data,long long k)
{long long t1,t2,t3,t4;        long long d1,d2,d3,d4;d1 = p;d2 = q;d3 = 1;d4 = 0;if(k == 1 || k == 0)return;        matrixpow(data,k/2);t1 = (data[0]*data[0]+data[1]*data[2])%MOD;t2 = (data[0]*data[1]+data[1]*data[3])%MOD;t3 = (data[0]*data[2]+data[2]*data[3])%MOD;t4 = (data[1]*data[2]+data[3]*data[3])%MOD;data[0] = t1;data[1] = t2;data[2] = t3;data[3] = t4;if(k&1){t1 = (data[0]*d1+data[1]*d3)%MOD;t2 = (data[0]*d2+data[1]*d4)%MOD;t3 = (data[2]*d1+data[3]*d3)%MOD;t4 = (data[2]*d2+data[3]*d4)%MOD;data[0] = t1;data[1] = t2;data[2] = t3;data[3] = t4;}
}
void main()
{        long long data[4];long long res;while(scanf("%lld%lld%lld%lld%lld",&a0,&a1,&p,&q,&k)!=EOF){data[0] = p;data[1] = q;data[2] = 1;data[3] = 0;matrixpow(data,k-2);if(k == 0)res = a0%MOD;else{if(k == 1)res = a1%MOD;else{if(k>2)res = (data[0]*p*a1+a1*q*data[2]+a0*p*data[1]+a0*q*data[3])%MOD;elseres = (a1*p+a0*q)%MOD;}}printf("%lld\n",res);}
}



这篇关于九度OJ 1081:递推数列 (递归,二分法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/868738

相关文章

uva 568 Just the Facts(n!打表递推)

题意是求n!的末尾第一个不为0的数字。 不用大数,特别的处理。 代码: #include <stdio.h>const int maxn = 10000 + 1;int f[maxn];int main(){#ifdef LOCALfreopen("in.txt", "r", stdin);#endif // LOCALf[0] = 1;for (int i = 1; i <=

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

oracle11.2g递归查询(树形结构查询)

转自: 一 二 简单语法介绍 一、树型表结构:节点ID 上级ID 节点名称二、公式: select 节点ID,节点名称,levelfrom 表connect by prior 节点ID=上级节点IDstart with 上级节点ID=节点值 oracle官网解说 开发人员:SQL 递归: 在 Oracle Database 11g 第 2 版中查询层次结构数据的快速

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

UVa 10820 Send a Table (Farey数列欧拉函数求和)

这里先说一下欧拉函数的求法 先说一下筛选素数的方法 void Get_Prime(){ /*筛选素数法*/for(int i = 0; i < N; i++) vis[i] = 1;vis[0] = vis[1] = 0;for(int i = 2; i * i < N; i++)if(vis[i]){for(int j = i * i; j < N; j += i)vis[j] =

【UVA】10651-Pebble Solitaire(直接递归或者记忆化)

不知道这个题UVA的数据是怎么的,用2个方法交了,第一次直接递归,第二次记忆化剪枝,时间竟然一样!? 直接郁闷了,简单的二进制表示状态和二进制运算。 14145176 10651 Pebble Solitaire Accepted C++ 0.009 2014-09-04 09:18:21 #include<cstdio>#include<algorithm>#inclu

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置

HLJUOJ1128 HDU2046(数学递推)

1128: 递推求解专题练习三 Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 8   Solved: 6 [ Submit][ Status][ Web Board] Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数。 例如n=3时,为2× 3方格,骨牌的铺放方案有三

九度1077(最大序列和)

题目链接:点击打开链接 解题思路: 很经典的一道题。首先考虑一下细节问题,当序列都是0时,显然最后要输出0;当序列都是负数时,显然要输出最大的数。 细节处理完了,就可以回到正常轨道。我们开两个变量,分别保存当前的序列和与之前的最大值,我们更新当前序列和的条件是如果当前序列和是负数的时候,那我们必须更新,否则一定会使最后结果减小。更新过程中还要更新之前最大值即可。 完整代码: