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. mybatis源码分析(4)----org.apache.ibatis.binding包

    1.  我们通过接口操作数据库时,发现相关的操作都是在org.apache.ibatis.binding下 从sqSessin 获取getMapper() SqlSession session = s ...

  2. 原生+H5开发之:js交互【location方式】

    1. 交互方式总结 1Android与JS通过WebView互相调用方法,实际上是: Android去调用JS的代码 JS去调用Android的代码 二者沟通的桥梁是WebView 对于Android ...

  3. js中常用日期时间转换

    常用日期时间处理插件:1. timeago.js处理几分钟之前    2. day.js    3. moment.js 注意: 1. 此处的标准时间格式为  2018-03-23 13:35:47 ...

  4. ios开发中object-c中UTF-8 和 GBK 的 NSString 相互转化的方法

    应用都要遇到一个很头疼的问题:文字编码,汉字的 GBK 和 国际通用的 UTF-8 的互相转化稍一不慎, 就会满屏乱码.下面介绍 UTF-8 和 GBK 的 NSString 相互转化的方法   NS ...

  5. HDU 4705 Y (2013多校10,1010题,简单树形DP)

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submiss ...

  6. Spark编程指南V1.4.0(翻译)

    Spark编程指南V1.4.0 ·        简单介绍 ·        接入Spark ·        Spark初始化 ·        使用Shell ·        在集群上部署代码 ...

  7. SDRAM interface slashes pin count

    Many designs need deep buffering but don't require ultrahigh-memory bandwidth. Examples include imag ...

  8. Retrieving ST-Link/V2 Firmware from Update Utility

    http://www.taylorkillian.com/2013/01/retrieving-st-linkv2-firmware-from.html http://forum.easyelectr ...

  9. React事件初探

    作者:朱灵子 React 是一个 Facebook 和 Instagram 用来创建用户界面的 JavaScript 库.创造 React 是为了解决一个问题:构建随着时间数据不断变化的大规模应用程序 ...

  10. picker.js源码

    /** * LArea移动端城市选择控件 * * version:1.7.2 * * author:黄磊 * * git:https://github.com/xfhxbb/LArea * * Cop ...