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 ...
随机推荐
- OpenCV load 运行出错 cv::Exception 出错
今天在使用OpenCV的load函数时,出现错误,代码如下: cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); ...
- What is the relationship between Xcode, Swift and Cocoa?
Xcode is an IDE for developing Swift or Objective-C applications, which can use the Cocoa API (which ...
- python--简易员工信息系统编写
补充内容:eval 将字符串变成变量名locals 看输入的是否是字典中的一个keyfunc.__name____怎么看变量名的数据类型斐波那契数列 li=[1,1] while li[-1]&l ...
- paxos算法之粗浅理解
paxos出身 paxos出身名门,它爹是没多久前获得图灵奖的在分布式领域大名鼎鼎的LeslieLamport. paxos为何而生 那么Lamport他老人家为什么要搞这个东东呢,不是吃饱了撑的,而 ...
- SSH实现在WIN7系统下访问虚拟机中的Linux系统
使用的是centos6.4进行练习的,安装的是vmware8虚拟机.以下是总结的一些步骤: 一.确保vmware使用NAT的连接方式,如做地址.端口映射 首先查看vmware的中网络连接的一些方式:E ...
- LookAround开元之旅
http://blog.csdn.net/lancees/article/details/17696805
- 基于docker/虚拟机的esp32远程工作流
原文:基于docker/虚拟机的esp32远程工作流 工作流框图 背景说明 为什么需要这套工作流--为了满足高效和灵活的开发方式 因为我经常需要在公司和家里切换不同的电脑工作,所以编译环境需要在远程主 ...
- 统计 与 数学 induction 归纳 deduction 演绎 吴喜之老师
“统计的思维方式是归纳(induction),也就是从数据所反映的现实得到比较一般的模型,希望以此解释数据所代表的那部分世界.这和以演绎(deduction)问哦主的数学思维方式相反,演绎是在一些人为 ...
- Ace(二)Demo示例
Client: #include "ace/Log_Msg.h" #include "ace/OS.h" #include "ace/Service_ ...
- vue指令与$nextTick 操作DOM的不同之处
异步更新队列 可能你还没有注意到,Vue 异步执行 DOM 更新.只要观察到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据改变.如果同一个 watcher 被多次触发,只会被推 ...