我有这样的重复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
中的问题答案 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矩形。
不寻常的是,平铺必须分成两部分。
但是,您也可以将此作为一种平铺方式,将原有的4个瓷砖涂成红色,将另一组4个瓷砖涂成蓝色,这样最终的纸板就会有红色边和蓝色边。
设f(n)是用红色瓷砖平铺2 * n矩形的方法数,h(n)是用0或更多列红色瓷砖平铺2 * n矩形的方法数然后是一列或多列蓝色瓷砖。
现在,您可以找到一个简单的矩阵乘法,根据前两个值给出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
。