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相关文件夹的存取方式与函数解析---全
因为排版问题.转为markdown编辑: http://blog.csdn.net/self_study/article/details/58587412
- Java IO 类
IO包中绝大部分的类都是由以下四个类直接或间接继承来的InputStream OutputStream Reader 还有Writer 其中InputStream和OutputStream代表输入流和 ...
- SubmittingPatches, SubmitChecklist and CodingStyle
How to Get Your Change Into the Linux Kernel or Care And Operation Of Your Linus Torvalds For a pers ...
- iOS移动开发周报-第20期
iOS移动开发周报-第20期iOS移动开发周报-第20期 [摘要]:本期iOS移动开发周报带来如下内容:iOS 通知中心扩展制作入门,iOS APP可执行文件的组成,objc非主流代码技巧等. 教程 ...
- 【iOS开发-79】利用Modal方式实现控制器之间的跳转
利用Modal方法.事实上就是以下两个方法的运用. Modal方式的切换效果是从底部呈现. -(void)clickModal{ WPViewController *wp=[[WPViewContro ...
- javascript点滴积累
1. javascript中的array, set, map 均为数据容器,使用iterable内置的forEach方法 var a = ['A', 'B', 'C'];a.forEach(funct ...
- Python 007- python的各种函数
1.chr().unichr()和ord() chr()函数用一个范围在range(256)内的(就是0-255)整数作参数,返回一个对应的字符. unichr()跟它一样,只不过返回的是Unicod ...
- Windows8-x64 VMWare安装Linux CentOS6-x64
本文參考了:http://www.cnblogs.com/seesea125/archive/2012/02/25/2368255.html 其内容相当具体,以至于我还没依照其步骤做完.系统就已经安装 ...
- 问题 “cell 出栈 selectBox 已选的图标,被释放掉,再次进入屏幕时,没有了已选图标 ” 解决方案
如何 去解决 列表里面的selectBox已选情况,在滑出屏幕后被清除的问题. 我来在这里 详细说明一下, 在cell里面写一个方法,去专门修复滑出后,又滑进来 图标被冲刷掉的cell. 在 ...
- 【BZOJ3307】雨天的尾巴 线段树合并
[BZOJ3307]雨天的尾巴 Description N个点,形成一个树状结构.有M次发放,每次选择两个点x,y对于x到y的路径上(含x,y)每个点发一袋Z类型的物品.完成所有发放后,每个点存放最多 ...