如何在恒定时间内找到相关线性方程的解?

时间:2019-07-03 13:15:39

标签: arrays algorithm math data-structures

这是我有的一个示例问题:

Madhav参加了Riya的生日聚会。他是一个极客,所以他不知道她想要哪种礼物。 因此,他随身携带了一个整数数组。数组遵循特定顺序。数组的第一个元素是1。 数组的第二个元素是6。 数组的其他元素比其前后数的平均值小两个。 很明显,Riya觉得这个想法很愚蠢,因此她想惩罚Madhav。 她决定问Madhav数组的第n个数字。如果他说错了答案,她会打他一巴掌。 帮助Madhav摆脱这种尴尬局面。

输入:第一行包含T,测试用例的数量,而第二行T包含N,即要找到的上述数组的第N个元素。

输出:

对于每个测试用例,输出一个整数,该整数是数组的第N个数字。由于答案可能非常大,因此以109 + 7模为输出

约束:

1≤T≤105 1≤N≤1018

样品输入

2

1

3

样品输出

1

15

说明 第一个测试用例对于[1] = 1来说是微不足道的。在第二个测试用例中,a [2] =(a [1] + a [3])/ 2-2。替换[1]和a [2]的值,我们得到:6 =(1 + a [2])/ 2-2。因此,a [2] = 8 * 2-1 = 15

上述问题需要在恒定的时间和空间内解决。如何从前两个固定数(此处为1,6)中找到建立解决方案所需的n个线性方程式?

1 个答案:

答案 0 :(得分:1)

等式对应于

df['hour'] = df.time.dt.hour
df.groupby(by=["hour"]).your_column.mean()

这可以改写为

a[n] = (a[n-1] + a[n+1])/2 - 2

表达a[n+1] = 2(a[n]+2) - a[n-1] 并计算a[n] = a[n-1] + b[n]的第一个值:

b[n]

很容易看到b[1] = 1; b[2] = 5; b[3] = 9; b[4] = 13; b[5] = 17; etc.

可以通过归纳法检查该通式。然后,随之而来

b[n] = 4(n-1) + 1

然后

a[n] = a[n-1] + 4(n-1) + 1

最后,使用

a[n] = 4(n-1) + 1  
     + 4(n-2) + 1  
     + 4(n-3) + 1  
     + ...  
     + 1  

我们可以得出结论

sum_(i=0)^(n-1) (i) = n(n-1)/2

编程时,请注意溢出!