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
 

题目大意

求卢卡斯数的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 <cstdio>
#include <iostream>
#include <algorithm>
#include <ctime>
#include <cctype>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set> #define sqr(x) ((x)*(x))
#define LL long long
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define eps 1e-10
#define mod 1000000007 using namespace std; int cnt=0; typedef pair <LL,LL> qf;
qf operator + (qf a,qf b)
{
return make_pair((a.first+b.first)%mod,(a.second+b.second)%mod);
}
qf operator * (qf a,qf b)
{
// if ((((LL)a.first*(LL)b.first)%mod+((LL)a.second*(LL)b.second)%mod*5ll)%mod<0)
// printf("%d %d %d %d\n",a.first,a.second,b.first,b.second);
if (a.first<0) a.first+=mod;
if (b.first<0) b.first+=mod;
if (a.second<0) a.second+=mod;
if (b.second<0) b.second+=mod;
return make_pair((((LL)a.first*(LL)b.first)%mod+((LL)a.second*(LL)b.second)%mod*5ll)%mod,
(((LL)a.first*(LL)b.second)%mod+((LL)a.second*(LL)b.first)%mod)%mod);
} qf pow(qf a, LL x)
{
qf res(1,0);
qf multi=a;
while (x)
{
if (x&1)
{
res=res*multi;
}
multi=multi*multi;
x/=2;
}
return res;
}
LL pow(LL a,LL b)
{
LL res=1;
LL multi=a;
while (b)
{
if (b&1)
{
res=res*multi%mod;
}
multi=multi*multi%mod;
b/=2;
}
return res;
}
qf acce(qf a,LL b)
{
qf ans=make_pair(1,0);
// if (a==ans) return make_pair(b+1,0);//这条语句去掉后AC了。可是n+1不取模将会造成后面的结果爆掉
qf powe=a;
qf sum=a;
qf multi=make_pair(1,0);
while (b)
{
if (b&1)
{
ans=ans+(multi*sum);
multi=multi*powe;
}
sum=sum*(powe+make_pair(1,0));
powe=powe*powe;
b/=2;
}
return ans;
}
LL inv[100005];
qf r1[100005],r2[100005]; void egcd (LL a,LL b,LL &x,LL &y)
{
if (b==0)
{
x=1,y=0;
return ;
}
egcd(b,a%b,x,y);
LL t=x;
x=y;y=t-a/b*y;
}
int main()
{
LL x,y;
for (LL i=1;i<=100000;i++)
{
egcd(i,mod,x,y);
x=(x+mod)%mod;
inv[i]=x;
} r1[0]=make_pair(1,0);
r2[0]=make_pair(1,0);
for (int i=1;i<=100000;i++)
{
r1[i]=r1[i-1]*make_pair(1,1);
r2[i]=r2[i-1]*make_pair(1,-1);
} int T;
scanf("%d",&T); while (T--)
{
cnt=0;
LL n,m;
scanf("%I64d%I64d",&n,&m);
// n=1e18;
// m=1e5; qf ans=make_pair(0,0);
LL Ca=1;
LL v=pow(inv[2],m);
for (LL i=0;i<=m;i++)
{
// printf("%lld\n",Ca);
qf p(Ca,0);
qf tmp=r1[i]*r2[m-i]*make_pair(v,0);
tmp=acce(tmp,n);
tmp=tmp*p;
ans=ans+tmp;
Ca=Ca*(m-i)%mod;
Ca=Ca*inv[i+1]%mod;
}
LL aa=(LL)ans.first;
printf("%I64d\n",aa);
// printf("%d %d \n",ans.first,ans.second);
// printf("%d\n",cnt);
}
return 0;
}

[hdu 4959]Poor Akagi 数论(卢卡斯数,二次域运算,等比数列求和)的更多相关文章

  1. hdu 1568 (log取对数 / Fib数通项公式)

    hdu 1568 (log取对数 / Fib数通项公式) 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]= ...

  2. Least Common Multiple (HDU - 1019) 【简单数论】【LCM】【欧几里得辗转相除法】

    Least Common Multiple (HDU - 1019) [简单数论][LCM][欧几里得辗转相除法] 标签: 入门讲座题解 数论 题目描述 The least common multip ...

  3. 七夕节 (HDU - 1215) 【简单数论】【找因数】

    七夕节 (HDU - 1215) [简单数论][找因数] 标签: 入门讲座题解 数论 题目描述 七夕节那天,月老来到数字王国,他在城门上贴了一张告示,并且和数字王国的人们说:"你们想知道你们 ...

  4. hdu 5919 主席树(区间不同数的个数 + 区间第k大)

    Sequence II Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Tot ...

  5. HDU 1005 Number Sequence(数论)

    HDU 1005 Number Sequence(数论) Problem Description: A number sequence is defined as follows:f(1) = 1, ...

  6. hdu 4803 Poor Warehouse Keeper(贪心+数学)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u011328934/article/details/26005267 题目链接:hdu 4803 P ...

  7. HDU 4952 Poor Mitsui(贪心)

    HDU 4957 Poor Mitsui pid=4957" style="">题目链接 思路:利用相邻交换法去贪心就可以.注意容积为0的情况,这是个坑点 代码: ...

  8. HDU 1074 Doing Homework (动态规划,位运算)

    HDU 1074 Doing Homework (动态规划,位运算) Description Ignatius has just come back school from the 30th ACM/ ...

  9. C语言 · 数的运算

    算法提高 数的运算   时间限制:1.0s   内存限制:512.0MB      输入一个正整数(范围[1..10000]),打印其平方(不保留小数位).平方根.倒数.(用指针实现,保留2位小数,输 ...

随机推荐

  1. leetcode87. Scramble String

    leetcode87. Scramble String 题意: 给定一个字符串s1,我们可以通过将它分解为两个非空子字符串来表示为二叉树. 思路: 递归解法 对于每对s1,s2. 在s1某处切一刀,s ...

  2. 关于收到谷歌邮件 Googlebot can't access your site 的解决方法

    最近一段时间一直都收到谷歌的邮件,而且“新锐工作室”的关键字在谷歌收录及排名都没有了.下面图为谷歌蜘蛛无法抓取网站的截图,如果你在谷歌网管工具里收到类似消息,说明也中招了.[Webmaster Too ...

  3. 将dll文件注入到其他进程中的一种新方法

    http://www.45it.com/windowszh/201212/33946.htm http://www.hx95.cn/Article/OS/201212/65095.html 我们知道将 ...

  4. AX5511 Boost Converter

    GENERAL DESCRIPTION    The AX5511 is a current mode step up converter intended for small, low powera ...

  5. 【转】2012年7月12 – 腾讯公司 WEB高级应用开发工程师 最新面试题

    腾讯面试(WEB高级应用开发工程师<PHP>)非答案啊!!! 开始正题之前,容博主啰嗦两句吧,呵呵.(你也可跳过直接到红色字体看题!) 腾讯一直是我很敬重的企业,尽管小企鹅在战略上饱受争议 ...

  6. ubuntn 内核升级到LINUX v4.11.8:

    升级到LINUX v4.11.8: http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.11.8/linux-headers-4.11.8-041108_ ...

  7. 工作流引擎activiti入门

    眼下最新的版本号是5.17 1.下载:activiti-5.17.0.zip http://activiti.org/download.html 2.解压activiti-5.17.0.zip 3.打 ...

  8. 2016/4/14腾讯Android实习面试

    腾讯实习面试,面试官会先问你会什么,擅长什么.然后会依照这个问,问的也不是非常偏,问道你不会的就换下一个知识点. 主要问我的有这几个问题 图形学 1.Bizer曲线怎么绘制的.原理是什么 2.对栅格有 ...

  9. stl map中的lower_bound和 upper_bound

    map中的lower_bound和upper_bound的意思其实很简单,就两句话: map::lower_bound(key):返回map中第一个大于或等于key的迭代器指针 map::upper_ ...

  10. vmware workstation无法打开内核设备问题处理办法

    vmware workstation无法打开内核设备:\\Global\\vmx86 ? 解决办法如下: 开始 - 运行(输入CMD)- 确定或者回车,打开管理员命令窗口: net start vmc ...