Poor Akagi
Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 131 Accepted Submission(s): 29
Problem Description Akagi is not only good at basketball but also good at math. Recently, he got a sequence Ln from his teacher. Ln is defined as follow:
$$\Large L(n)=\begin{cases}
2 & \text{ if } n=0 \\
1 & \text{ if } n=1 \\
L(n-1)+L(n-2) & \text{ if } n>1
\end{cases}$$
And Akagi’s teacher cherishes Agaki’s talent in mathematic. So he wants Agaki to spend more time studying math rather than playing basketball. So he decided to ask Agaki to solve a problem about Ln and promised that as soon as he solves this problem, he can go to play basketball. And this problem is:
Given N and K, you need to find \(\Large\sum\limits_{0}^{N}L_i^K\)
And Agaki needs your help.
Input This problem contains multiple tests.
In the first line there’s one number T (1 ≤ T ≤ 20) which tells the total number of test cases. For each test case, there an integer N (0 ≤ N ≤ 10^18) and an integer K (1 ≤ K ≤ 100000) in a line.
Output For each test case, you need to output the answer mod 1000000007 in a line.
Sample Input
3
3 1
2 2
4 3
Sample Output
10
14
443
Source BestCoder Round #5
题目大意
求卢卡斯数的k次方的前n项和 卢卡斯数为L[0]=2,L[1]=1,L[n]=L[n-2]+L[n-1](n>=2)
题目思路 当时看到题还以为直接根据 zoj 3774 找出二次剩余…… 结果发现1e9+7不存在二次剩余 最后发现了一种很巧妙的做法 直接根据卢卡斯数的通项公式
设
则求和公式为
定义二次域
此时直接对二次域进行加、乘操作即可(最后的结果为整数,故根号五不会存在在结果之中)
重载二次域的加号和乘号,定义二次域的快速幂运算,全部带入公式即可。 =.=好像这一题的杭电的数据还没有修正 公比为一时直接返回n+1(可能带来溢出)竟然AC了 然后正解依然WA……
这里只放正解代码
/**
**author : ahm001 **
**source : hdu 4959**
**time : 08/21/14 **
**type : math **
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include