spoj-9964

目录
[隐藏]

9964. Fibonacci vs Polynomial
Problem code: PIBO
Define a sequence Pib(n) as following

  • Pib(0) = 1
  • Pib(1) = 1
  • otherwise, Pib(n) = Pib(n-1) + Pib(n-2) + P(n)

Here P is a polynomial.

Given n and P, find Pib(n) modulo 1,111,111,111.

Input

First line of input contains two integer n and d (0 ≤ n ≤ 109, 0 ≤ d ≤ 100), d is the degree of polynomial.

The second line contains d+1 integers c0,c1 … cd, represent the coefficient of the polynomial(Thus P(x) can be written as Σcixi). 0 ≤ ci ≤ 100 and cd ≠ 0 unless d = 0.

Output

A single integer represents the answer.

Example

<b>Input:</b>
10 0
0

<b>Output:</b>
89

<b>Input:</b>
10 0
1

<b>Output:</b>
177

<b>Input:</b>
100 1
1 1

<b>Output:</b>
343742333

题解

(第一次用latex详细写计算过程,调试了一下午的数学公式):
我们都知道可以这么快速计算斐波那契数列:令 F=(1110), 那么 Fn(Fib(n)Fib(n1))=(Fib(n+1)Fib(n)) . 我们也知道二项式公式:(n+1)k=ki=0Cikni,
(n+1)d=C0dnd+C1dnd1++Cddn0,
(n+1)d1=C0d1nd1+C1d1nd2++Cd1d1n0,
.

A=(11cdcd1c0100000CddCd1dC0d000Cd1d1C0d10000C00),pn=(Pibo(n)Pibo(n1)ndnd1n0)
那么:
Apn=pn+1
也就是:
(11cdcd1cdotsc0100cdotscdots000CddCd1dC0d000Cd1d1C0d10000C00)(Pibo(n1)Pibo(n2)ndnd1n0)=(Pibo(n)Pibo(n1)(n+1)d(n+1)d1(n+1)0)
复杂度是:O((d+3)3logn) 也就是1033log109

进行优化:

B(n)=Pibo(n)+di=0kini=Pibo(n)+kdnd+kd1nk1++k0,那么
B(n)=B(n1)+B(n2)
也就有(B(n)B(n1))=(1110)n1(B(1)B(0))
现在复杂度是O(8logn) to calculate Bn8log109

但是我们需要知道k0kd 来计算初始值B(1)),(B(0) 以及从B(n)反解出 Pibo(n)

B(n)=B(n1)+B(n2) 我们可以得到:
Pibo(n)+di=0kini=[Pibo(n1)+di=0ki(n1)i]+[Pibo(n2)+di=0ki(n2)i]
和原来的比较:
Pibo(n)=Pibo(n1)+Pibo(n2)+di=0cini
可以得出
di=0ki(n1)i+di=0ki(n2)idi=0kinidi=0cini
也就是
di=0[ki(n1)i+ki(n2)ikini]di=0cini

化简这个式子得到:
(C00C11[(1)1+(2)1]C22[(1)2+(2)2]Cdd[(1)d+(2)d]0C01C12[(1)1+(2)1]Cd1d[(1)d1+(2)d1]00C02Cd2d[(1)d2+(2)d2]000C0d)(k0k1k2kd)=(c0c1c2cd)
可以容易发现这是一个上三角且主对角线是1的矩阵,利用下面的式子可以进一步化简,而且不需要进行计算Ckn时候的阶乘计算,而全部化成加法运算,进一步优化
Ckn=Ck1n1+Ckn1

python代码

如下:

本文链接:spoj-9964

转载声明:本站文章若无特别说明,皆为原创,转载请注明来源:Rexdf,谢谢!^^


此条目发表在数论分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。

*

:zsmilebig: :zsadbig: :zwiredbig: :zgreenhappy: more »

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据