时间限制: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;
            }
            else
                a1 = 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: 1081
    User: liangrx06
    Language: C
    Result: Accepted
    Time:10 ms
    Memory: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;
else
res = (a1*p+a0*q)%MOD;
}
}
printf("%lld\n",res);
}
}

九度OJ 1081:递推数列 (递归,二分法)的更多相关文章

  1. 九度OJ 1081 递推数列 -- 矩阵二分乘法

    题目地址:http://ac.jobdu.com/problem.php?pid=1081 题目描述: 给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q.这里n >= ...

  2. 九度OJ 1073:杨辉三角形 (递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3780 解决:1631 题目描述: 输入n值,使用递归函数,求杨辉三角形中各个位置上的值. 输入: 一个大于等于2的整型数n 输出: 题目可 ...

  3. 九度oj 题目1496:数列区间

    题目描述: 有一段长度为n(1<=n<=1000000)的数列,数列中的数字从左至右从1到n编号.初始时数列中的数字都是0. 接下来我们会对其进行m(1<=m<=100000) ...

  4. 九度OJ 1092:Fibonacci (递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1923 解决:1378 题目描述: The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} ...

  5. 九度OJ 1338:角斗士 (递归、DP)

    时间限制:3 秒 内存限制:32 兆 特殊判题:否 提交:213 解决:66 题目描述: 角斗士是古罗马奴隶社会的一种特殊身份的奴隶,他们的职责是在角斗场上进行殊死搏斗,为了人们提供野蛮的娱乐.他们的 ...

  6. NOIP2013提高问题求解T2(关于递推与递归)

    同步发表于我的洛谷博客. NOIP2013提高问题求解2: 现有一只青蛙,初始时在n号荷叶上.当它某一时刻在k号荷叶上时,下一时刻将等概率地随机跳到1,2,--,k号荷叶之一上,直到跳到第1号荷叶为止 ...

  7. 【九度OJ】题目1205:N阶楼梯上楼问题 解题报告

    [九度OJ]题目1205:N阶楼梯上楼问题 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次 ...

  8. 【九度OJ】题目1078:二叉树遍历 解题报告

    [九度OJ]题目1078:二叉树遍历 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历 ...

  9. 【九度OJ】题目1175:打牌 解题报告

    [九度OJ]题目1175:打牌 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1175 题目描述: 牌只有1到9,手里拿着已经排好序的 ...

随机推荐

  1. SecureCRT保持连接,不会过一段时间关闭Session

    [Options]->[Global Options]->[General]->[Default Session]点击[Edit default settings]按钮,在[Term ...

  2. Autolayout 02

    Working with Auto Layout Programmatically 如果你在运行阶段添加或者移除views你就需要通过代码来添加约束来保证你的interface能正确适应size或者o ...

  3. ios编程规范

    允许使用较长的描述尽量不要使用缩写,而是将完整的意思写出来.源于代码的维护可能会被不同文化背景的programmer阅读 适当的命名前缀,比如给变量,协议等,不要给方法加前缀 方法命名规则一般以小写字 ...

  4. ios内存管理笔记(二)

    1)实现部分: 复制代码 @synthesize window=_window; @synthesize viewController=_viewController; 通常看到的都没有包含=部分,@ ...

  5. Linux 线程浅析

    进程和线程的区别与联系 在许多经典的操作系统教科书中,总是把进程定义为程序的执行实例,它并不执行什么, 只是维护应用程序所需的各种资源,而线程则是真正的执行实体. 为了让进程完成一定的工作,进程必须至 ...

  6. 2017.2.13 开涛shiro教程-第十二章-与Spring集成(二)shiro权限注解

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第十二章-与Spring集成(二)shiro权限注解 shiro注 ...

  7. 2016.6.21 eclipse配置server locations时按钮为灰色

    我在使用eclipse配置Tomcat服务器的时候发现,默认情况下Tocmat把我们部署的项目放在了workspaces下面,需要手动修改将其放在tomcat的安装路径下的webapp内. 从图中可以 ...

  8. Archlinux 下的 VMWare Workstation 维护笔记

    印象中 Archlinux 下的 VMWare Workstation 总是出问题, 因此写这个帖子, 记录出问题时间/原因/解决方案. PS: 每次更新内核后可能需要重新编译 vmware 的内核模 ...

  9. FileUpload控件预览图片

    HTML代码: <tr> <td class="auto-style1">上传图片:</td> <td> <asp:FileU ...

  10. RFS+AutoItLibrary测试Web对话框

    Selenium2library在我们实际测试web页面的时候基本上已经够用了,不过还是会有部分情况下会脱离Selenium2library的控制,无法进行操作.比如说下载文件的时候,要选择保存文件在 ...