九度OJ题目1081:递推数列解题报告

九度-剑指Offer习题全套答案 使用vs2010编写,直接用vs2010打开加压后的.sln文件即可看到所有的代码,右键点击某一个cpp-“属性”-“从生成中排除”-“否”,即可运行该cpp,注意相应其他cpp该属性要设置为“是”。九度OJ上面的剑指Offer习题全套答案,全部AC,且具有较好的时间复杂度。部分参考网络上的idea,但代码已经尽量要求简洁,是OJ练习不可多得的参考代码。 立即下载
题目1081:递推数列

时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:7791

解决:1088

题目描述:

给定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
解题思路:在按常规思路做这道题的时候,总是wrong answer或者Time Limit Exceed,后来参考了别人的做法,才AC,不过有一处还是没弄太懂,此处是别人的做法,供以后再思考吧。
      

题目分析1:

一个很显然的想法是递推计算这k+1个数对10000的模,实现如下:

源代码1(TLE)

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #define MOD 10000  
  4.     
  5. int main()  
  6. {  
  7.     int a0, a1, p, q, k;  
  8.     while(scanf("%d%d%d%d%d", &a0, &a1, &p, &q, &k) != EOF)  
  9.     {  
  10.         int *pa = (int *)malloc(sizeof(int)*(k+1));  
  11.         pa[0] = a0;  
  12.         pa[1] = a1;  
  13.         int i;  
  14.         for(i = 2; i <= k; i++)                      //时间复杂度为O(k)  
  15.             pa[i] = (p * pa[i-1] + q * pa[i-2])%MOD;  
  16.         printf("%d\n", pa[k]);  
  17.         free(pa);  
  18.     }  
  19.     //system("pause");  
  20.     return 0;  
  21. }  
  22. /************************************************************** 
  23.     Problem: 1081 
  24.     User: superlc320 
  25.     Language: C++ 
  26.     Result: Time Limit Exceed 
  27. ****************************************************************/  

题目分析2:

很不幸,超时了。以上算法的时间复杂度为O(k), 当k很大时,会TLE。
再次分析题目,会发现递推公式
进而推出
问题转化为求
这里要用到 矩阵二分乘法。
矩阵二分乘法是一种有效的快速计算矩阵幂的算法。
矩阵二分乘法通常可以将线性递推问题O(n)时间缩短到O(log(n))。
关于矩阵二分乘法更详细的内容可以问度娘。

源代码2

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #define MOD 10000       //结果取MOD,避免高精度运算  
  4.    
  5. /*将矩阵p与矩阵q相乘,结果存入p矩阵*/  
  6. void Matrix_mul(int p[2][2], int q[2][2])  
  7. {  
  8.     int i, j, k;  
  9.     int t[2][2]={0};  
  10.     for(i = 0; i <= 1; i++)  
  11.         for(j = 0; j <= 1; j++)  
  12.             for(k = 0; k <= 1; k++)  
  13.                 t[i][j] += p[i][k] * q[k][j];  
  14.     for(i = 0; i <= 1; i++)  
  15.         for(j = 0; j <= 1; j++)  
  16.             p[i][j] = t[i][j] % MOD;  
  17. }  
  18.    
  19. /*计算p矩阵的n次方,结果存入p矩阵*/  
  20. void Matrix_cal(int p[2][2], int n)  
  21. {  
  22.     int i, j;  
  23.     int t[2][2];  
  24.     for(i = 0; i <= 1; i++)  
  25.         for(j = 0; j <= 1; j++)  
  26.             t[i][j] = p[i][j];  
  27.     if(n == 1)   
  28.         return;  
  29.     else if(n & 1)  
  30.     {  
  31.         Matrix_cal(p, n-1);  
  32.         Matrix_mul(p, t);  
  33.     }  
  34.     else  
  35.     {  
  36.         Matrix_cal(p, n/2);  
  37.         Matrix_mul(p, p);  
  38.     }  
  39. }  
  40.     
  41. int main()  
  42. {  
  43.     int a0, a1, p, q, k;  
  44.     while(scanf("%d%d%d%d%d", &a0, &a1, &p, &q, &k) != EOF)  
  45.     {  
  46.         if(k == 0)   
  47.             printf("%d\n", a0);    
  48.         else if(k == 1)   
  49.             printf("%d\n", a1);   
  50.         else  
  51.         {  
  52.             int matrix[2][2] = { {p%MOD, q%MOD}, {1, 0} };  
  53.             Matrix_cal(matrix, k-1);  
  54.             printf("%d\n", (a1 * matrix[0][0] + a0 * matrix[0][1]) % MOD);  
  55.         }  
  56.     }  
  57.     //system("pause");  
  58.     return 0;  
  59. }  
  60. /************************************************************** 
  61.     Problem: 1081 
  62.     User: superlc320 
  63.     Language: C++ 
  64.     Result: Accepted 
  65.     Time:10 ms 
  66.     Memory:1020 kb 
  67. ****************************************************************/  
源代码3
  1. #include <stdio.h>  
  2.    
  3. #define MOD 10000  
  4.    
  5. typedef struct matrix{  
  6.     int a00, a01, a10, a11;  
  7. }Matrix;  
  8.    
  9. void MatrixMul(Matrix * m, Matrix * n){  
  10.     Matrix tmp;  
  11.     tmp.a00 = (m->a00 * n->a00 + m->a01 * n->a10) % MOD;  
  12.     tmp.a01 = (m->a00 * n->a01 + m->a01 * n->a11) % MOD;  
  13.     tmp.a10 = (m->a10 * n->a00 + m->a11 * n->a10) % MOD;  
  14.     tmp.a11 = (m->a10 * n->a01 + m->a11 * n->a11) % MOD;  
  15.     *m = tmp;  
  16. }  
  17.    
  18. int main(void){  
  19.     int a0, a1, p, q, k;  
  20.    
  21.     while (scanf ("%d%d%d%d%d",  
  22.             &a0, &a1, &p, &q, &k) != EOF){  
  23.         if (k == 0) {printf ("%d\n", a0 % MOD); continue;}  
  24.         if (k == 1) {printf ("%d\n", a1 % MOD); continue;}  
  25.         Matrix pq = {p%MOD, q%MOD, 1, 0};  
  26.         Matrix ans = {1, 0, 0, 1};  
  27.         --k;  
  28.         while (k >= 1){  
  29.             if ((k & 1) == 1)  
  30.                 MatrixMul (&ans, &pq);  
  31.             MatrixMul (&pq, &pq);  
  32.             k = k >> 1;  
  33.         }  
  34.         printf ("%d\n", (ans.a00*a1+ans.a01*a0) % MOD);  
  35.     }  
  36.    
  37.     return 0;  
  38. }  
顶
3
踩
WinForm制作文件传输助手,Tcp局域网传输文件,传输速度受限于宽带和硬盘速度上限 文件传输助手为什么会出现,是因为项目上有些特殊的地方限制太多了,连插硬盘都需要关软件,联网又要开很不方便,网络限制一般软件只能局域网通信,还要开特定的端口等,你才能在电脑上通信,这样和机房的服务器远程的时候文件就不好拿过去,又不可能每次都去开机房的门。现在这个功能比较简单,只能单文件发送,但是其实比U盘硬盘方便,一般的六类网线传输压缩包在50M/s以上,U盘硬盘复制就不行了,特别如果是像我们学校这种网络结构,一个学校都在一个局域网,那真的方便!普通的局域网用特定IP和端口,通信也是很方便的。 阅读详情

相关推荐

LiveGBS流媒体平台GB/T28181实战指南:海康NVR物联网卡摄像头注册失败全链路排查与抓包技巧

本文详细解析了LiveGBS流媒体平台中海康NVR物联网卡摄像头注册失败的常见问题及解决方案。通过全链路排查与抓包技巧,包括物联网卡配置、多网卡冲突处理、防火墙设置等,帮助用户快速定位并解决GB/T28181协议下的设备注册难题,提升流媒体平台部署效率。

weixin_29290947的博客 494

九度OJ

1.1016 这是一道简单题,主要要考虑到,比如说108,8,2这种类似的情况,其中8被认为是08,所以最后两位相同,输出-1。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char a[20], b[20], *p, *q; int k, a1, b1, len1, len2, a2, b2; while (scanf("%s%s%d", a, b, &a...

Ftworld21的专栏 1151

【操作系统】 Operation System 第一章:概述

B站 陈渝老师 清华大学 https://www.bilibili.com/video/av6538245?from=search&seid=436175425155932048 相关资料(源自B站下方评论区) https://www.shiyanlou.com/courses/221 配套上机实验地址 https://b23.tv/av18273642/p1 这个适合跨考和基础薄弱的 h...

iwanderu的博客 4万+

OJ

1.网址:ac.jobdu.com 2.如果以前是王道论坛的用户,直接输入那个账号和密码就行。   如果不是的话,可以在首页新注册一个。 3.做题:在首页上方第二栏“在线练习”中点击“题库”,题目列表就出来了。 4.题目的大体框架: (1)题目描述:会有一些小故事,或者要求你完成的任务。 (2)输入:对于输入数据的格式及范围的描述。 (3)输出:对于输出数据的格式及范围的描述

阿里Darker 1647

贝莱德(BlackRock)—— 阿拉丁(Aladdin)平台的 AI 赋能升级

全称(资产、负债、债务与衍生品投资网络),是贝莱德自主研发的一体化投资管理与风险管理技术平台,被誉为全球资管行业的 “

xm_mm的博客 1736

保姆级避坑指南:在Ubuntu 22.04上用ROS2 Humble搞定TurtleBot3的SLAM与导航(附5个常见报错解决方案)

本文提供了一份详细的Ubuntu 22.04上使用ROS2 Humble和TurtleBot3进行SLAM建图与导航的避坑指南,涵盖Gazebo启动失败、场景加载问题、环境变量设置、GLIBCXX版本冲突及Nav2参数配置等5个常见报错的解决方案,帮助开发者高效完成机器人导航项目。

weixin_29062823的博客 286

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

题目描述 给定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的模。 示例1 输入 复制 20 1 1 14 5 输出 复制 8359 #include <stdio.h> #...

weixin_41943168的博客 584

GAN模型中的常见变体有哪些,如DCGAN、WGAN和CGAN等?

生成对抗网络(GAN)是一种强大的深度学习模型,它由生成器和判别器两个网络组成,通过对抗训练的方式实现生成数据的能力。随着研究的发展,出现了许多GAN的变体,每个变体都有其独特的改进和特点。

huidhsu的博客 2262

九度OJ-1450:产生冠军

这道题厉害了。= =想不明白 算法分析:   由于这里的优先关系具有传递性,故可利用有向图表示优先关系:“A优胜于C”==可抽象为==》“A到C之间存在有向路径”。有了这层抽象就能进行以下分析: ①“不能出现循环优先关系”《==》不能出现环路:进行拓扑排序来检测有无环路 ②“存在冠军”《==》“存在一个人优胜于所有人”《==》存在顶点v到所有其他顶点都有有向通路《==在无环条件下==》有且

听风就是雨 748

Comsol 弧形声学换能器声聚焦仿真

1. 弧度和曲率半径:弧形声学换能器的形状和曲率半径对声聚焦效果有重要影响。通常,较小的曲率半径和较大的弧度可以实现更强的声聚焦效果。弧形声学换能器声聚焦是指将声波能量集中在弧形声学换能器的特定区域内,以实现更强的声场强度和分辨率。4. 数值仿真和优化:使用声学仿真软件进行数值仿真可以帮助设计和优化弧形声学换能器的声聚焦效果。通过调整几何参数、材料特性和激励信号等参数,可以模拟和优化声聚焦效果。2. 激励信号:通过调整激励信号的频率和幅值,可以实现声波在弧形声学换能器中的聚焦效果。

声学黑洞仿真工作室 1618

NTC热敏电阻选型快速指南

NTC(Negative Temperature Coefficient Thermistor)负温度系数热敏电阻器,是由锰Mn,镍Ni,铜Cu,一氧化碳Co等烧结而成的氧化物。其电阻值随温度的升高而减小,即具有复温度系数,故被称为负温度系数热敏电阻。本文对热敏电阻的应用场景,结构特点和选型参数进行总结。

fydar的博客 1296

九度OJ 1081: 递推数列

题目描述: 给定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年清华大学计算

superlc320的专栏 1704

论文阅读: SIGIR 2025 ID-Free Not Risk-Free: LLM-Powered Agents Unveil Risks in ID-Free Recommender Syste

咱们平时用的推荐系统(比如购物APP推商品、视频APP推剧),大多是“有ID”的——每个用户、每个商品都有个专属ID,系统靠这些ID记录你的浏览、购买历史,再给你推喜欢的东西。但这种方式有个大问题:新用户、新商品刚上线时没有ID历史数据,系统没法精准推荐,这就是“冷启动”难题。后来人们搞出了“无ID推荐系统”:不用ID了,改成直接分析商品的文字信息(比如商品标题、描述),靠大语言模型(LLM,类似ChatGPT的技术)把文字转成“语义代码”,再通过这些“代码”判断你可能喜欢什么。

CSPhD-winston的博客 977

九度OJ 题目1081:递推数列

 题目描述: 给定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 二.题目分析      看似简单的题,网网都有巧妙的设置,能够找到一种时间,

lhyer的专栏 1168

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

九度OJ 1081 清华09机试题之递推数列

//九度OJ 1081 清华09机试题之递推数列 //http://ac.jobdu.com/problem.php?pid=1081 //利用二分求幂法和蛮生疏的函数递归调用编写的矩阵的大数幂。 //相信N年后的我再回来看看这稚气未脱的刚入道时自己写的代码,会心一笑吧哈哈 #include #define N 10000 typedef struct M{ long long h[2][2]

DNA的DFA 515

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

九度OJ题目1081:递推数列-快速幂

矩阵快速幂模版。题目描述: 给定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思路: 求斐波那契数列的时候,递推公式为 f(n) = f(n-1)+f(

wxyfennie的博客 1139

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

九度oj1081递推数列的算法

这个题用到了矩阵二分乘法,之前没接触过这个东西,这个矩阵二分乘法确实不错,从网上学了一篇文章,进入百度搜九度1081就能搜索到的那边文章,从那里,我学到了矩阵二分乘法和递归算法。 可以将原本o(n)的复杂度弄成o(logn),对于这个题!别小看这个n和logn,比如n为1024,logn居然只有10,差太远了,天壤之别,你logn只要算10次,人家要1024次。 关于递归方法和非递归方法,非递

博客园的粉丝 827

九度 oj 题目1081:递推数列

http://ac.jobdu.com/problem.php?pid=1081 参考了(照抄了)http://blog.youkuaiyun.com/zxasqwedc/article/details/8763967  #include #include #include #define LL long long static LL a0,a1,p,q,k; typedef

guojiaqi007的专栏 252

九度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。 求第k个数对10000的模。 输入: 输入包括5个整数:a0、a1、p、q、k。 输出: 第k个数a(k)对10000的模。 样例输入: 20 1 1

liushaobo的专栏 1717

九度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的模。

梁山伯的专栏 537

清华大学2009年复试上机题 解题报告

九度OJ 题目1081:递推数列 时间限制:1 秒  内存限制:32 兆  特殊判题:否  提交:989  解决:112  题目描述:     给定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的模。

PythonFX的专栏 1738

【九度OJ】1081【矩阵】【快速幂】

等级五,比较难,坑很多。

ALiTuTu的专栏 869

【九度 OJ 08】简单查找x

【九度 OJ 08】简单查找x 文章目录【九度 OJ 08】简单查找x一、题意二、解答过程 一、题意 二、解答过程 思路: 就是枚举暴力解,不难 #include <iostream> int main() { int buf[200]; int n; while(scanf("%d",&n)!=EOF) { for (int i = 0; i <n ; ++i) { scanf("%d",

令狐_JackieHao的博客 696

九度OJ 题目1035:找出直系亲属

一.题目描述:     如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外)祖父,祖母,则A,B是C的grandparent,C是A,B的grandchild,如果A,B是C的(外)曾祖父,曾祖母,则A,B是C的great-grandparent,C是A,B的great-grandchild,之后再多一辈,则在关系上加一个great-。 输入:

lhyer的专栏 789

九度OJ-1040:Prime Number

题目地址:点击打开链接题目描述: Output the k-th prime number. 输入: k≤10000 输出: The k-th prime number. 样例输入: 3 7 样例输出: 5 17 来源:2008年上海交通大学计算机研究生机试真题 答疑:解题遇到问题?分享解题心得?讨论本题请访问:http

听风就是雨 413
上一篇: 九度OJ题目1013:开门人和关门人解题报告
下一篇: 数据库:JDBC编程
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值