CSP初赛知识点讲解(十)
数列
等差数列
a[i]-a[i-1]=公差d
已知第i项为a[i],公差为d,求第k项:
a [ k ] = a [ i ] + ( k − i ) × d 。 a[k]=a[i]+(k-i)\times d。 a[k]=a[i]+(k−i)×d。
已知首项a[1],公差d,求和
a [ n ] = a [ 1 ] + ( n − 1 ) × d a[n]=a[1]+(n-1)\times d a[n]=a[1]+(n−1)×d
S [ n ] = ( a [ 1 ] + a [ n ] ) × n ÷ 2 S[n]=(a[1]+a[n])\times n\div2 S[n]=(a[1]+a[n])×n÷2
等比数列
a [ i ] = a [ i − 1 ] × q a[i]=a[i-1]\times q a[i]=a[i−1]×q(公比)。
已知第i项为a[i],公比为q,求第k项:
a [ k ] = a [ i ] × q k − i a[k]=a[i]\times q^{k-i} a[k]=a[i]×qk−i
已知首项a,公比q,求和
∵ S [ n ] = a + a × q + a × q 2 + . . . a × q n − 1 \because S[n]=a+a\times q+a\times q^2+...a\times q^{n-1} ∵S[n]=a+a×q+a×q2+...a×qn−1
$\therefore q\times S[n]=a\times q+a\times q^2+…a\times q^{n-1}+a \times q^n $
$\therefore (q-1)S[n]=a\times q^n-a $
∴ S [ n ] = a × ( q n − 1 ) ÷ ( q − 1 ) \therefore S[n]=a\times (q^n-1)\div(q-1) ∴S[n]=a×(qn−1)÷(q−1)
数列求解方法
1:类似于f(n)=f(n-1)+n这种递推公式
可以用错位相减来求解
$f(n-1)=f(n-2)+(n-1) $
…
f ( 2 ) = f ( 1 ) + 2 f(2)=f(1)+2 f(2)=f(1)+2
每一项左边相加,右边相加,然后同项一减,就得到 f(n)=f(1)+常数项 ,一般f(1)或者f(0)给出了 这种时间复杂度为O(n2)
2:类似于f(n)=a*f(n-1)+b这种递推公式
重新构造一个数列,形式为 f(n)-x=a(f(n-1)-x) 求解出x的值,这样f(n)-x就是一个等比数列了,就可以求出f(n)-x 的值了,同样,也可以求出f(n)的值,推导过程如下
递推公式分析
我们从递推公式的基本形式开始:
f ( n ) = a ⋅ f ( n − 1 ) + b f(n) = a \cdot f(n-1) + b f(n)=a⋅f(n−1)+b
这是一个一阶递推关系,其中每一项 ( f(n) ) 都是通过前一项 ( f(n-1) ) 乘以常数 ( a ) 并加上常数 ( b ) 计算得到的。
构造等比数列
为了简化求解这个递推关系,我们希望将其转化为一个更容易处理的形式,即等比数列。具体方法是尝试构造一个新的数列,使得它满足等比数列的性质。
我们假设:
g ( n ) = f ( n ) − x g(n) = f(n) - x g(n)=f(n)−x
这里 ( x ) 是一个我们需要确定的常数。代入递推公式中:
g
(
n
)
=
f
(
n
)
−
x
g(n) = f(n) - x
g(n)=f(n)−x
g
(
n
−
1
)
=
f
(
n
−
1
)
−
x
g(n-1) = f(n-1) - x
g(n−1)=f(n−1)−x
将它们带入递推公式:
f ( n ) = a ⋅ f ( n − 1 ) + b f(n) = a \cdot f(n-1) + b f(n)=a⋅f(n−1)+b
我们得到:
g ( n ) + x = a ⋅ ( g ( n − 1 ) + x ) + b g(n) + x = a \cdot (g(n-1) + x) + b g(n)+x=a⋅(g(n−1)+x)+b
展开并整理:
g ( n ) + x = a ⋅ g ( n − 1 ) + a ⋅ x + b g(n) + x = a \cdot g(n-1) + a \cdot x + b g(n)+x=a⋅g(n−1)+a⋅x+b
移项后得到:
g ( n ) = a ⋅ g ( n − 1 ) + ( a ⋅ x + b − x ) g(n) = a \cdot g(n-1) + (a \cdot x + b - x) g(n)=a⋅g(n−1)+(a⋅x+b−x)
为了让这个新构造的数列 ( g(n) ) 成为一个等比数列,我们需要消除上式中的常数项,即需要使得:
a ⋅ x + b − x = 0 a \cdot x + b - x = 0 a⋅x+b−x=0
整理得到:
x ⋅ ( a − 1 ) = − b x \cdot (a - 1) = -b x⋅(a−1)=−b
从而得到 ( x ) 的值为:
x = − b a − 1 x = \frac{-b}{a - 1} x=a−1−b
构造等比数列后的形式
得到了 ( x ) 的值后,原公式中的 ( g(n) ) 就变成了一个等比数列:
g ( n ) = f ( n ) − x g(n) = f(n) - x g(n)=f(n)−x
因此新的递推公式为:
f ( n ) − x = a ⋅ ( f ( n − 1 ) − x ) f(n) - x = a \cdot (f(n-1) - x) f(n)−x=a⋅(f(n−1)−x)
等价于:
g ( n ) = a ⋅ g ( n − 1 ) g(n) = a \cdot g(n-1) g(n)=a⋅g(n−1)
这个公式表明 ( g(n) ) 是以比率 ( a ) 递增的等比数列。
求解等比数列
等比数列的通项公式为:
g ( n ) = g ( 1 ) ⋅ a n − 1 g(n) = g(1) \cdot a^{n-1} g(n)=g(1)⋅an−1
其中 ( g(1) = f(1) - x )。代入上面的 ( g(n) = f(n) - x ):
f ( n ) − x = ( f ( 1 ) − x ) ⋅ a n − 1 f(n) - x = (f(1) - x) \cdot a^{n-1} f(n)−x=(f(1)−x)⋅an−1
最后可以解出 ( f(n) ) 的通项公式:
f ( n ) = x + ( f ( 1 ) − x ) ⋅ a n − 1 f(n) = x + (f(1) - x) \cdot a^{n-1} f(n)=x+(f(1)−x)⋅an−1
进一步展开:
f ( n ) = − b a − 1 + ( f ( 1 ) + b a − 1 ) ⋅ a n − 1 f(n) = \frac{-b}{a - 1} + \left(f(1) + \frac{b}{a - 1}\right) \cdot a^{n-1} f(n)=a−1−b+(f(1)+a−1b)⋅an−1
结论
通过构造新的数列 ( g(n) = f(n) - x ),我们将原递推公式转化为了等比数列,并通过求解得到 ( x ) 的值。这样,原始递推公式的通项公式也就得到了:
f ( n ) = − b a − 1 + ( f ( 1 ) + b a − 1 ) ⋅ a n − 1 f(n) = \frac{-b}{a - 1} + \left(f(1) + \frac{b}{a - 1}\right) \cdot a^{n-1} f(n)=a−1−b+(f(1)+a−1b)⋅an−1
这个方法的关键在于将递推关系简化为等比数列,从而使求解变得简单。
3:类似于f(n)=f(n-1)+f(n-2)这种递推公式(每一项 前有系数)
这里可以用的方法是**“常数变换法”(Method of Constant Coefficients)或有时称为"递推关系的齐次化"**(Homogenization of Recurrence Relation)。这种方法主要用于解决线性递推关系,尤其是当递推关系涉及多个前项时,比如像斐波那契数列这种情况。
方法概述
对于递推关系:
f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n) = f(n-1) + f(n-2) f(n)=f(n−1)+f(n−2)
我们希望将其转化为一个更容易处理的形式。通过构造新的数列并引入系数,我们可以简化原递推关系,使其转化为更容易求解的形式。
步骤解释
-
构造新数列并引入系数:
我们假设:
f ( n ) + a ⋅ f ( n − 1 ) = b ⋅ ( f ( n − 1 ) + a ⋅ f ( n − 2 ) ) f(n) + a \cdot f(n-1) = b \cdot (f(n-1) + a \cdot f(n-2)) f(n)+a⋅f(n−1)=b⋅(f(n−1)+a⋅f(n−2))
这里,( a ) 和 ( b ) 是需要确定的常数。
-
展开并整理等式:
代入假设并展开上面的公式:
f ( n ) + a ⋅ f ( n − 1 ) = b ⋅ f ( n − 1 ) + b ⋅ a ⋅ f ( n − 2 ) f(n) + a \cdot f(n-1) = b \cdot f(n-1) + b \cdot a \cdot f(n-2) f(n)+a⋅f(n−1)=b⋅f(n−1)+b⋅a⋅f(n−2)
将等式展开并比较左右两边的系数,可以得到:
f ( n ) = ( b − a ) ⋅ f ( n − 1 ) + b ⋅ a ⋅ f ( n − 2 ) f(n) = (b - a) \cdot f(n-1) + b \cdot a \cdot f(n-2) f(n)=(b−a)⋅f(n−1)+b⋅a⋅f(n−2)
-
确定 ( a ) 和 ( b ) 的值:
为了使原递推关系和新构造的关系一致,我们要求:
b − a = 1 以及 b ⋅ a = 1 b - a = 1 \quad \text{以及} \quad b \cdot a = 1 b−a=1以及b⋅a=1
这两个方程可以解出 ( a ) 和 ( b ) 的值。
解第一个方程: b = a + 1 b = a + 1 b=a+1
代入第二个方程:
( a + 1 ) ⋅ a = 1 (a + 1) \cdot a = 1 (a+1)⋅a=1
解这个二次方程:
a 2 + a − 1 = 0 a^2 + a - 1 = 0 a2+a−1=0
通过解这个方程得到 ( a ) 的值:
a = − 1 ± 5 2 a = \frac{-1 \pm \sqrt{5}}{2} a=2−1±5
选取一个解(通常取正的根):
a = − 1 + 5 2 (称为黄金分割比 ϕ 的倒数) a = \frac{-1 + \sqrt{5}}{2} \quad \text{(称为黄金分割比 \(\phi\) 的倒数)} a=2−1+5(称为黄金分割比 ϕ 的倒数)
然后 b = a + 1 = 1 + 5 2 b = a + 1 = \frac{1 + \sqrt{5}}{2} b=a+1=21+5
-
构造新递推关系并求解:
通过引入 ( a ) 和 ( b ),我们得到了一个新的等式:
f ( n ) + ϕ ⋅ f ( n − 1 ) = m f(n) + \phi \cdot f(n-1) = m f(n)+ϕ⋅f(n−1)=m
其中 ( m ) 是一个常数。这相当于我们将递推关系转化为了一个可以求解的齐次递推关系,然后可以使用前面提到的等比数列方法求解。
总结
这种方法是一种递推关系的齐次化方法,通过引入适当的常数 ( a ) 和 ( b ),将复杂的递推关系转换成更易于求解的形式。通过这个过程,你可以将问题简化,进而找到递推关系的通解。