【求解答】有道笔试,后台开发,编程第3题怎么做?

毫无思路,直接暴力迭代,只通过10%,怒跪……

PS:Orz……为什么我只有10%而大家都是60%……我真的取模了啊……TAT
PS2:感觉每次考编程题都这样,前两题快速通过,第三题死都不AC……

题目:魔力手环
某魔力手环上有n个数,范围在[0, 99]。
该手环每次使用魔力后,每个数发生如下变化:a[i] = a[i] + a[i+1];最后一个数则加上第一个数(手环是一个“环形”);如果和数达到100,则对100取模(除以100的余数)。
现给定一个手环初始状态,问k次后每个数分别是多少?

输入:
两行;
第1行为两个数n和k,用空格分开,1<=n<=50,1<=k<=200,000,000;
第2行为n个数,用空格分开,每个数范围在[0, 99],表示手环初始状态。

输出:
一行;手环在k次使用后的状态,n个数,用空格分开,最后一个数后面没有空格。

#网易#
全部评论
快速幂 这是斐波那契快速幂的讲解: 当N很小的时候,我们直接通过递推公式便可以计算。当N很大的时候,只要我们的电脑足够好,我们仍然可以直接通过递推公式来计算。 但是我们学算法的,总是这样直接枚举不是显得很Low么,所以我们要用一个好的算法来加速(装X)。 事实上,对于这种线性递推式,我们可以用矩阵乘法 来求第n项。对于本题Fibonacci数列,我们希望找到一个2x2的矩阵M,使得(a, b) x M = (b, a+b),其中(a, b)和(b, a+b)都是1x2的矩阵。 显然,只需要取M = [0, 1; 1, 1]就可以了: 进一步得到: 那么接下来的问题是,能不能快速的计算出M^n?我们先来分析一下幂运算。由于乘法是满足结合律的,所以我们有: 不妨将k[1]..k[j]划分的更好一点? 其中(k[1],k[2]...k[j])2表示将n表示成二进制数后每一位的数字。上面这个公式同时满足这样一个性质: 结合这两者我们可以得到一个算法: 1. 先计算出所有的{a^1, a^2, a^4 ... a^(2^j)},因为该数列满足递推公式,时间复杂度为O(logN) 2. 将指数n二进制化,再利用公式将对应的a^j相乘计算出a^n,时间复杂度仍然为O(logN) 则总的时间复杂度为O(logN) 这种算法因为能够在很短时间内求出幂,我们称之为“快速幂”算法。
点赞
送花
回复
分享
发布于 2017-03-25 16:50
暴力的话,应该是60%啊
点赞
送花
回复
分享
发布于 2017-03-25 16:08
滴滴
校招火热招聘中
官网直投
60
点赞
送花
回复
分享
发布于 2017-03-25 16:10
暴力同60,后来想的是根据k的次数应该有个规律
点赞
送花
回复
分享
发布于 2017-03-25 16:10
同暴力60%
点赞
送花
回复
分享
发布于 2017-03-25 16:11
Xi= Cn 1Xi + Cn 2Xi+1 + ..... 要先把这个系数先算出来。。。。
点赞
送花
回复
分享
发布于 2017-03-25 16:11
暴力是60,我猜你忘记取模了
点赞
送花
回复
分享
发布于 2017-03-25 16:11
暴力60%飘过
点赞
送花
回复
分享
发布于 2017-03-25 16:12
有个思路:就以题目给得例子来说 3 2 1 2 3 输出  8 9 7 8=1+2*2+3* 1 9=2+3*2+1*1 7=3+1*2+2*1
点赞
送花
回复
分享
发布于 2017-03-25 16:17
思路没说完整:就以题目给得例子来说 3 2 1 2 3 输出  8 9 7 8=1+2*2+3* 1 9=2+3*2+1*1 7=3+1*2+2*1 那么 3 4 1 2 3 这个输入呢? 输出是:33 31 32 33=8+9*2+7*1 31=9+7*2+8*1 32=7+8*2+9 也就是说,第一次能计算出k=n-1的情况,第二次能计算出k=2*(n-1)的情况,第三次能计算出k=3*(n-1)的情况,时间复杂度由原来的K*N变为K*N/(N-1) 不过还有%100这个条件没考虑清楚
点赞
送花
回复
分享
发布于 2017-03-25 16:38
我也取模了,也是10%....是超过了规定的空间。
点赞
送花
回复
分享
发布于 2017-03-25 16:38
你考虑到要先保存第一个数吗,最后一个数加的是原先的第一个数,不是改变后的第一个数
点赞
送花
回复
分享
发布于 2017-03-26 10:34

相关推荐

头像
不愿透露姓名的神秘牛友
05-14 18:44
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务