如何解决这种复发?

时间:2013-07-30 19:47:36

标签: algorithm math recursion recurrence

我有这样的重复f(n)=(2*f(n-1)+2*f(n-2))%10007;

现在针对特定的我需要找到:

g(n)=(f(n)f(0)+f(n-1)f(1)+....+f(0)f(n))%10007.

例如,如果n = 3,

g(3)=(f(3)f(0)+f(2)f(1)+f(1)f(2)+f(0)f(3))%10007.

n可以大到10 ^ 9。我可以使用f(n)中的矩阵指数找到log(n)的值,但我无法弄清楚如何获得g(n)

(我需要这个来解决amritapuri 2008 regional

中的问题

3 个答案:

答案 0 :(得分:1)

暂时忘掉10007左右。

F(x)=sum(f(n)*x^n)。然后是F(x)=(f(0)+x*(f(1)-2f(0))/(1-2x-2x^2)

G(x)=sum(g(n)*x^n)。然后是G(x)=F(x)^2

因此问题减少到找到一系列的系数(模数10007)。

答案 1 :(得分:0)

背景

最初的问题是如何使用4种类型的瓷砖平铺2 * n矩形。

不寻常的是,平铺必须分成两部分。

提示1

但是,您也可以将此作为一种平铺方式,将原有的4个瓷砖涂成红色,将另一组4个瓷砖涂成蓝色,这样最终的纸板就会有红色边和蓝色边。

提示2

设f(n)是用红色瓷砖平铺2 * n矩形的方法数,h(n)是用0或更多列红色瓷砖平铺2 * n矩形的方法数然后是一列或多列蓝色瓷砖。

提示3

现在,您可以找到一个简单的矩阵乘法,根据前两个值给出h和f的下一个值,并使用标准矩阵幂取幂来查找最终值。

示例代码

这是一个Python演示,该公式给出了与原始求和相同的答案。

def f(n):
    """Number of ways to tile 2*n board with red tiles"""
    if n<0: return 0
    if n==0: return 1
    return 2*f(n-1)+2*f(n-2)

def g_orig(n):
    """Number of ways to tile 2*n board in two halves"""
    return sum(f(k)*f(n-k) for k in range(n+1))

def h(n):
    """Number of ways to tile 2*n board with red tiles and at least one column of blue tiles"""
    if n<1: return 0
    # Consider placing one column of blue tiles (either 2*1 or 2 1*1)
    t=2*(f(n-1)+h(n-1))
    # Also consider placing two columns of blue tiles (either a 2*2 or L shaped and a 1*1)
    t+=2*(f(n-2)+h(n-2))
    return t

def g(n):
    return f(n)+h(n)

for n in range(10):
    print n,g_orig(n),g(n)

答案 2 :(得分:0)

诀窍是序列f(n) mod 10007的周期为10007,即f(n) mod 10007 = f(n + 10007) mod 10007。所以你需要做的只是(1)计算f(0 .. n - 1) mod 10007,(2)计算f(n - k)f(k) mod 10007的{​​{1}},然后(3)根据你的等式求它们。您甚至不需要幂幂运算方法来计算0 <= k < 10007

相关问题