九度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
思路:
直接一步一步的递推肯定是要超时的。对这种求第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:递推数列 (递归,二分法)的更多相关文章
- 九度OJ 1081 递推数列 -- 矩阵二分乘法
题目地址:http://ac.jobdu.com/problem.php?pid=1081 题目描述: 给定a0,a1,以及an=p*a(n-1) + q*a(n-2)中的p,q.这里n >= ...
- 九度OJ 1073:杨辉三角形 (递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3780 解决:1631 题目描述: 输入n值,使用递归函数,求杨辉三角形中各个位置上的值. 输入: 一个大于等于2的整型数n 输出: 题目可 ...
- 九度oj 题目1496:数列区间
题目描述: 有一段长度为n(1<=n<=1000000)的数列,数列中的数字从左至右从1到n编号.初始时数列中的数字都是0. 接下来我们会对其进行m(1<=m<=100000) ...
- 九度OJ 1092:Fibonacci (递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1923 解决:1378 题目描述: The Fibonacci Numbers{0,1,1,2,3,5,8,13,21,34,55...} ...
- 九度OJ 1338:角斗士 (递归、DP)
时间限制:3 秒 内存限制:32 兆 特殊判题:否 提交:213 解决:66 题目描述: 角斗士是古罗马奴隶社会的一种特殊身份的奴隶,他们的职责是在角斗场上进行殊死搏斗,为了人们提供野蛮的娱乐.他们的 ...
- NOIP2013提高问题求解T2(关于递推与递归)
同步发表于我的洛谷博客. NOIP2013提高问题求解2: 现有一只青蛙,初始时在n号荷叶上.当它某一时刻在k号荷叶上时,下一时刻将等概率地随机跳到1,2,--,k号荷叶之一上,直到跳到第1号荷叶为止 ...
- 【九度OJ】题目1205:N阶楼梯上楼问题 解题报告
[九度OJ]题目1205:N阶楼梯上楼问题 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次 ...
- 【九度OJ】题目1078:二叉树遍历 解题报告
[九度OJ]题目1078:二叉树遍历 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1078 题目描述: 二叉树的前序.中序.后序遍历 ...
- 【九度OJ】题目1175:打牌 解题报告
[九度OJ]题目1175:打牌 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1175 题目描述: 牌只有1到9,手里拿着已经排好序的 ...
随机推荐
- 2.搭建配置最简单的spring mvc 工程-基础版
目标:用最少的东西,搭建可以运行的最最基础的springMvc登陆校验项目! spring 4 1.首先配置pom.xml引入spring 相关jar, 引用都有注释, 无关的可以暂时不引用. < ...
- python的列表元组字典集合比较
定义 方法 列表 可以包含不同类型的对象,可以增减元素,可以跟其他的列表结合或者把一个列表拆分,用[]来定义的 eg:aList=[123,'abc',4.56,['inner','list'],7- ...
- 用NSLogger代替NSLog输出调试信息
安装 NSLogger分为两部分,LoggerClient和NSLogger Viewer,你的App需要导入前者,后者是一个独立的mac应用,NSLogger所有的调试信息将输出到这个应用中. 安装 ...
- Java线程状态中BLOCKED和WAITING有什么差别?
刚才在看CSDN的问答时.发现这个问题. 原问题的作者是在观察jstack的输出时提出的疑问.那么BLOCKED和WAITING有什么差别呢? 答复在JDK源代码中能够找到,例如以下是java.lan ...
- appium查找元素心得
在使用appium测试app的时候并没有selenium那么好用,为什么呢? 个人觉得是因为定位方式太少,selenium中的xpath已经强大到基本可以找到任何一个元素. 但是在appium中xpa ...
- 自学MVC看这里——全网最全ASP.NET MVC 教程汇总【转】
自学MVC看这里——全网最全ASP.NET MVC 教程汇总 http://www.cnblogs.com/powertoolsteam/archive/2015/08/13/4667892.html ...
- linux中nl用法
linux 中nl 命令使用 nl :添加行号打印 -b: 指定行号指定的方式,主要有两种: -b a : 表示不论是否为空行,都同样列出行号 -b t : 如果有空行,则不列出那一行 ...
- 为什么要点两下才能删除一个li节点 原来是空白节点作怪
奇怪吧,下面的代码居然要点两次button才能删除一个li节点: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional// ...
- 调用聚合数据新闻头条API
基于聚合数据新闻头条接口 支持阅读新闻类型包括: 各类社会.国内.国际.体育.娱乐.科技等资讯,更新周期5-30分钟. 新闻内容类型的多选,支持皮肤功能. 使用前需要有聚合数据账号,并实名制后通过 新 ...
- 一次JVM调优的笔记
1. JVM Tuning基础知识 1.1 Java堆结构 Java堆可以处于物理上不连续的内存空间上,只要逻辑上是连续的即可.Java堆就是各种对象分配和保存的内存空间,线程间共享.Java堆分为E ...