Yet Another Number Sequence
题意:
$F_0 = 0, F_1 = 1, F_n = F_{n-1} + F_{n-2}$
求解$\sum_{i=1}^n{ F_i i^K } \ mod \ 10^9+7$。
解法:
记$S(n,m) = \sum_{i=1}^n { F_i i^m}$
这样有:
$$S(2n,m) = \sum_{i=1}^n{F_i i^m} + \sum_{i=1}^n{F_{i+n} (i+n)^m}$$
记$G = \lgroup \begin{matrix} 1 & 1 \\ 1 & 0 \end{matrix} \rgroup$
有$F_n = G_{1,1}$
将$S(n,m)$的含义换为对应求和的矩阵。
1.考虑从$S(n,m)$推到$S(2n,m)$
$$S(2n,m) = \sum_{i=1}^n{G^n i^m} + G^n \sum_{i=1}^n{G^{i} (i+n)^m}$$
$$S(2n,m) = \sum_{i=1}^n{G^n i^m} + G^n \sum_{i=1}^n{G^{i} \sum_{r=0}^m{i^rm^{m-r}C_m^r}}$$
$$S(2n,m) = \sum_{i=1}^n{G^n i^m} + G^n \sum_{r=0}^m{m^{m-r}C_m^r S(n,r)}$$
这样$O(K)$完成单次转移。
2.考虑从$S(n,m)$推到$S(n+1,m)$
$$S(n+1,m) = S(n,m) + (n+1)^m G^{n+1}$$
这样分治下去,总效率$O(K^2 logn)$
(注意本题中n过大,要先对于n取模再进行乘法)
#include <iostream>
#include <cstdio>
#include <cstring> #define LL long long
#define P 1000000007LL using namespace std; struct MA
{
LL a[][]; void init()
{
memset(a,,sizeof(a));
} MA operator*(const MA &x)const
{
MA c;
for(int i=,j,k;i<;i++)
for(j=;j<;j++)
{
c.a[i][j]=;
for(k=;k<;k++)
{
c.a[i][j]+=a[i][k]*x.a[k][j]%P;
if(c.a[i][j]>=P) c.a[i][j]-=P;
}
}
return c;
} MA operator*(const LL &x)const
{
MA c;
for(int i=,j;i<;i++)
for(j=;j<;j++)
c.a[i][j] = a[i][j]*x%P;
return c;
} MA operator+(const MA &x)const
{
MA c;
for(int i=,j;i<;i++)
for(j=;j<;j++)
c.a[i][j] = (a[i][j]+x.a[i][j])%P;
return c;
} void print()
{
puts("Matrix");
for(int i=,j;i<;i++)
{
for(j=;j<;j++) cout<<a[i][j]<<' ';
cout<<endl;
}
}
}; MA G,Gn;
MA S[][];
LL n,power[],C[][];
int K,now; void solve(LL n)
{
if(n==)
{
now=;
Gn = G;
for(int i=;i<=K;i++) S[now][i] = G;
return;
}
solve(n>>);
now^=;
MA tmp;
power[]=;
for(int k=;k<=K;k++) power[k] = power[k-]*((n>>1LL)%P)%P;
for(int k=;k<=K;k++)
{
tmp.init();
for(int r=;r<=k;r++)
tmp = tmp + ( S[now^][r] * (C[k][r]*power[k-r]%P) );
S[now][k] = S[now^][k] + (Gn * tmp);
}
Gn = Gn*Gn;
if(n&)
{
Gn = Gn*G;
power[]=1LL;
for(int k=;k<=K;k++)
{
S[now][k] = S[now][k] + (Gn * power[k]);
power[k+] = power[k]*(n%P)%P;
}
}
} int main()
{
G.a[][]=; G.a[][]=;
G.a[][]=; G.a[][]=;
while(~scanf("%I64d%d",&n,&K))
{
C[][]=;
for(int i=;i<=K;i++)
{
C[i][]=;
for(int j=;j<=i;j++)
{
C[i][j] = C[i-][j-]+C[i-][j];
if(C[i][j]>=P) C[i][j] -= P;
}
}
solve(n);
cout << S[now][K].a[][] << endl;
}
return ;
}
Yet Another Number Sequence的更多相关文章
- HDU 1005 Number Sequence
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- POJ 1019 Number Sequence
找规律,先找属于第几个循环,再找属于第几个数的第几位...... Number Sequence Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- HDOJ 1711 Number Sequence
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Number Sequence
Number Sequence A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) ...
- [AX]AX2012 Number sequence framework :(三)再谈Number sequence
AX2012的number sequence framework中引入了两个Scope和segment两个概念,它们的具体作用从下面序列的例子说起. 法国/中国的法律要求财务凭证的Journal nu ...
- KMP - HDU 1711 Number Sequence
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 1005:Number Sequence(水题)
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- Number Sequence 分类: HDU 2015-06-19 20:54 10人阅读 评论(0) 收藏
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...
- HDU 1711 Number Sequence(数列)
HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- HDU 1005 Number Sequence(数列)
HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
随机推荐
- android 5.X Toolbar+DrawerLayout实现抽屉菜单
前言 android5.X新增的一个控件Toolbar,这个控件比ActionBar更加自由,可控,因为曾经的ActionBar的灵活性比較差,所以google逐渐使用Toolbar替代Action ...
- 《后会无期》票房赶超《小时代3》 大数据解读韩寒VS四娘之争
7月25日.韩寒导演的处女作<后会无期>零点首映,而郭四娘导演的<小时代3:刺金时代>比<后会无期>早上映一周.也就是7月17日正式公映,韩寒与四娘之间向来不缺乏话 ...
- Activiti实战
说实话,接触Activiti已经是3年前的事情,那时候组里想做一个流程自动化的application,并且记录用户点击.做单量等.第一次听说Activiti,感觉挺好奇的,遂看了下相关的文档跟同事的代 ...
- 微信小程序 如何使用globalData
微信小程序在JavaScript文件中声明的变量和函数只在该文件中有效:不同的文件中可以声明相同名字的变量和函数,不会互相影响.如果希望在各个页面之间共同使用某些信息,并且可以对共享数据进行修改设置, ...
- hdu1878欧拉回路(DFS+欧拉回路)
欧拉回路 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 关于mongorc.js文件详解
最近阅读了<<mongodb权威指南第二版>>,发现这本书比之前的第一版好,很多地方讲解很详细.下面就翻译下谈下这个文件. 首先,启动shell的时候,mongorc.js文件 ...
- jquery设置多个css样式
$(selector).css({property:value, property:value, ...}) 实例: $("p").css({ "color": ...
- 使用MSSQL同步&发布数据库快照遇到错误:对路径“xxxxx”访问被拒绝的解决方法
使用MSSQL同步 数据库同步做后后测试:先在同步那台服务器(服务器A)数据库里修改里面数据库,然后再去被同步那台服务器(服务器B)看下数据有没被同步过去 发布数据库快照遇到错误:对路径“xxxxx” ...
- Android笔记之权限库AndPermission
GitHub地址:https://github.com/yanzhenjie/AndPermission 这个库可以节省不少代码量和时间 使用示例如下 findViewById(R.id.btnGet ...
- svn下载
首先介绍的是SVN安装包的下载,分别包括服务器版和客户端版 下载地址:http://subversion.apache.org/packages.html 打开后,点击Windows 分别下载客户端( ...