`
YuHuang.Neil
  • 浏览: 187624 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

互联网公司面试题之十一

阅读更多
问题:递推数列【BAIDU】:给定a0,a1,以及an=p*a(n-1)+q*a(n-2)中的p,q。这里n>=2。求第k数对10000的模。要求性能尽可能优化。

说明:所给出的程序的输入包括a0,a1,p,q,k,输出第k个数a(k)对10000的模。

答:初看这个题目,第一印象就是无非考考递归程序设计或者线性递推罢了。其实仔细想了想题目要求性能尽可能优化,简单地使用递归或者线性递推的设计显然不能达到要求,在实际编程中也验证了这一点,使用递归的设计方法的时候,当k增加到300左右程序就不动了,效率非常低,使用线性递推的时间复杂度可以达到O(n),但是对于一个大k来说复杂度还是有优化的余地。思前想后,我觉得使用矩阵二分乘法来对付大k的情况还是可行的,下面算法,对超过1000的k值,利用前置矩阵计算的结果,可以大大减少计算的次数。算法的实现如下:

#include <stdio.h>

typedef struct matrix{
	int k;
	long a[2][2];
}Matrix;

int main(){
	long q,p,a0,a1;
	int i,s,t,k;
	Matrix m[30];
	for(;scanf("%ld%ld%ld%ld%d",&a0,&a1,&p,&q,&k)!=EOF;){
		t=0;
		//For k=2
		m[0].k=1;
		m[0].a[0][0]=0;		m[0].a[0][1]=q%10000;
		m[0].a[1][0]=1;		m[0].a[1][1]=p%10000;
		if(k-1<=m[0].k) goto CALC;
		//For k=3
		t=1;
		m[1].k=2;
		m[1].a[0][0]=m[0].a[0][1];		m[1].a[0][1]=(q*p)%10000;
		m[1].a[1][0]=m[0].a[1][1];		m[1].a[1][1]=(q+p*p)%10000;
		if(k-1==m[1].k) goto CALC;
		//For k=4
		t=2;
		m[2].k=3;
		m[2].a[0][0]=m[1].a[0][1];		m[2].a[0][1]=(q*q+q*p*p)%10000;
		m[2].a[1][0]=m[1].a[1][1];		m[2].a[1][1]=(2*q*p+p*p*p)%10000;
		if(k-1==m[2].k) goto CALC;
		//For k=5
		t=3;
		m[3].k=4;
		m[3].a[0][0]=m[2].a[0][1];		m[3].a[0][1]=(2*q*q*p+q*p*p*p)%10000;
		m[3].a[1][0]=m[2].a[1][1];		m[3].a[1][1]=(q*q+3*q*p*p+p*p*p*p)%10000;
		if(k-1==m[3].k) goto CALC;
		//For k=6
		t=4;
		m[4].k=5;
		m[4].a[0][0]=m[3].a[0][1];		m[4].a[0][1]=(q*q*q+3*q*q*p*p+q*p*p*p*p)%10000;
		m[4].a[1][0]=m[3].a[1][1];		m[4].a[1][1]=(3*q*q*p+q*p*p*p+3*q*p*p+p*p*p*p*p)%10000;
		if(k-1==m[4].k) goto CALC;
		
		t=4;s=5;
		if(k-1>=10){
			for(;m[t].k+s<k;++t){
				m[t+1].k=m[t].k+s;	  //大k加速				
m[t+1].a[0][0]=(m[t].a[0][0]*m[t].a[0][0]+m[t].a[0][1]*m[t].a[1][0])%10000;
				m[t+1].a[0][1]=(m[t].a[0][0]*m[t].a[0][1]+m[t].a[0][1]*m[t].a[1][1])%10000;
				m[t+1].a[1][0]=(m[t].a[1][0]*m[t].a[0][0]+m[t].a[1][1]*m[t].a[1][0])%10000;
				m[t+1].a[1][1]=(m[t].a[1][0]*m[t].a[0][1]+m[t].a[1][1]*m[t].a[1][1])%10000;
				s+=s;
			}
		}
		
		for(;k!=m[t].k+1;){
			i=t;
			while(m[t].k+m[i].k>k-1 && i>0) --i;
			m[t+1].k=m[t].k+m[i].k;
			m[t+1].a[0][0]=(m[t].a[0][0]*m[i].a[0][0]+m[t].a[0][1]*m[i].a[1][0])%10000;
			m[t+1].a[0][1]=(m[t].a[0][0]*m[i].a[0][1]+m[t].a[0][1]*m[i].a[1][1])%10000;
			m[t+1].a[1][0]=(m[t].a[1][0]*m[i].a[0][0]+m[t].a[1][1]*m[i].a[1][0])%10000;
			m[t+1].a[1][1]=(m[t].a[1][0]*m[i].a[0][1]+m[t].a[1][1]*m[i].a[1][1])%10000; 
			++t;
		}		
		CALC:
		{
			if(t==0) {
				if(k==0){
					printf("%ld\n",a0%10000);
				}else if(k==1){
					printf("%ld\n",a1%10000);
				}else{
					printf("%ld\n",(a0*m[t].a[0][1]+a1*m[t].a[1][1])%10000);
				}
			}else{
				printf("%ld\n",(a0*m[t].a[0][1]+a1*m[t].a[1][1])%10000);
			}
		}
			
	}
	return 0;
}






运行结果:




  • 大小: 14.8 KB
分享到:
评论

相关推荐

    国内互联网公司面试题汇总

    《国内互联网公司面试题汇总》是一份集合了国内众多知名互联网企业面试题目的宝贵资源,涵盖了包括BAT(百度、阿里巴巴、腾讯)在内的诸多行业巨头,如小米、网易、搜狗等公司的技术面试内容。这份资料的重点在于C和...

    172份,7701页互联网大厂面试题.pdf

    172份,7701页互联网大厂面试题 172份,7701页互联网大厂面试题 172份,7701页互联网大厂面试题

    国内一线互联网公司面试题整理

    国内一线互联网公司面试题整理,包括 BAT TMD。帮助你顺利度过面试难关!

    2019互联网面试题第2季,互联网面试题及答案,Java

    "2019互联网面试题第2季"聚焦了这一年度的重要面试趋势和热门问题,旨在帮助求职者更好地准备并理解面试官可能提出的各种问题。这份资料可能包含一系列的面试题目、解答以及相关思维导图,帮助求职者系统地梳理和...

    互联网公司Java面试题及核心知识点

    内容概要:本书从近一百套最新一线互联网公司面试题中精选而出,涵盖Java架构面试所有技术栈,包 括JVM,Mysql,并发,Spring,Mybatis,Redis,MQ,Zookeeper,Netty, Dubbo,Spring Boot,Spring Cloud,数据结构...

    各大互联网公司面试真题及18年秋招面经

    这份“各大互联网公司面试真题及18年秋招面经”资料包,汇聚了众多互联网公司的面试经验分享和真题,对于准备求职的同学们来说,无疑是一份宝贵的参考资源。 首先,我们要了解“面经”,这是面试经验的简称,通常...

    互联网企业面试真题汇总

    互联网企业面试真题 深圳-OPPO.pdf 深圳-银盛支付-Java中级.pdf 深圳-中国平安-Java中级.pdf 深圳-商汤科技.pdf 深圳-腾讯.pdf 深圳-乐信.pdf 深圳-蚂蚁金服.pdf 上海-携程.pdf 深圳-丰巢科技.pdf 厦门-中软国际-...

    互联网校招题库资料笔试面试真题具体面试问题回答技巧腾讯阿里培训资料.zip

    ava工程师面试题大全-100%公司笔试题你都能碰到几个.docx Java开发工程师上机笔试题.docx Java开发求职面试题.docx Java开发笔试题.docx Java数据结构类面试题.docx Java数据结构题.docx Java笔试面试宝典.docx Java...

    2019互联网面试题第2季.mmap

    尚硅谷周阳互联网大厂面试题(第2季) 脑图。包括JUC多线程并发、JVM和GC等目前大厂笔试中会考、面试中会问、工作中会用的高频难点知识。上半场,从多线程并发入手,分层递进讲解,逐步让大家掌握volatile、原子类和...

    2019互联网面试题第2季.rar

    2019,尚硅谷,周阳,互联网面试题脑图,第2季,.mmap版

    互联网架构面试题

    在互联网行业中,架构面试题是评估候选人技术能力的重要方式,特别是对于Java开发人员。下面将详细探讨一些常见的Java相关的互联网架构面试题目,以及这些题目所涵盖的知识点。 1. **并发编程** - Java中的线程...

    一线互联网企业面试题.pdf

    一线互联网企业的面试题库通常会覆盖多个知识点,包括编程语言、软件开发、网络通信、数据结构、算法、并发编程和系统设计等。在整理知识点时,需要注意细节的准确性,并以平实的语言讲述,避免技术术语的滥用。以下...

    互联网大厂面试题集合.zip

    《互联网大厂面试题集合》是一个综合性的学习资源,涵盖了互联网公司面试中常见的技术知识点,旨在帮助求职者准备面试,提升技术能力。这份压缩包包含了300多页的资料,涉及了前端开发、网络基础、算法等多个核心...

    互联网大厂面试题第二季 尚硅谷阳哥主讲

    尚硅谷阳哥主讲面试题.

    BAT各大互联网面试题

    ### BAT各大互联网面试题知识点详解 #### 一、设置DOM元素CSS样式的三种方式 1. **外部样式表**:通过`&lt;link&gt;`标签引入一个外部的CSS文件,这种方式适用于多个页面共享相同的样式规则,有利于代码复用和维护。 ``...

    各大互联网公式面试题大汇总

    在IT行业的求职过程中,面试是至关重要的一环,尤其对于阿里巴巴、百度、腾讯等顶级互联网公司而言,面试题往往涵盖广泛且深度颇深。这些公司的面试题不仅检验候选人的技术实力,还考察其逻辑思维、问题解决能力和...

    最新各互联网BAT等笔试面试真题复习资料

    2. **产品设计与管理**:产品相关的面试题可能涵盖需求分析、用户研究、产品规划、竞品分析、项目管理等方面。 3. **互联网行业知识**:了解互联网行业的最新动态、发展趋势、商业模式等,可能涉及数据分析、云计算...

    互联网校招面试笔试题合集

    常见的面试题包括链表、树、图、堆、队列、栈等数据结构的操作和应用,以及快速排序、归并排序、二分查找等经典算法的实现。例如,可能会让你设计一个LRU缓存淘汰策略,或者解决两数之和的问题。 2. **编程语言基础...

    BAT谷歌微软等各IT公司互联网C++ JAVA 计算机笔试面试真题复习资料108个文档合集.zip

    BAT谷歌微软等各IT公司互联网C++ JAVA 计算机笔试面试真题复习资料108个文档合集 C++基础面试题.docx C++开发工程师面试题库.docx C++技能测试试卷一及答案.docx C++技能测试试卷二及答案.docx c++笔试题汇总.pdf ...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    面试题包含了不同技术层面的面试问题,同时也能对一些没有面试开发经验的小白给予不可估量的包装, 让你的薪水绝对翻倍, 本人亲试有效.Java面试题84集、java面试专属及面试必问课程,所有的面试题有视屏讲解, 解答方案....

Global site tag (gtag.js) - Google Analytics