题意:

$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的更多相关文章

  1. HDU 1005 Number Sequence

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  2. POJ 1019 Number Sequence

    找规律,先找属于第几个循环,再找属于第几个数的第几位...... Number Sequence Time Limit: 1000MS Memory Limit: 10000K Total Submi ...

  3. HDOJ 1711 Number Sequence

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. Number Sequence

    Number Sequence   A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) ...

  5. [AX]AX2012 Number sequence framework :(三)再谈Number sequence

    AX2012的number sequence framework中引入了两个Scope和segment两个概念,它们的具体作用从下面序列的例子说起. 法国/中国的法律要求财务凭证的Journal nu ...

  6. KMP - HDU 1711 Number Sequence

    Number Sequence Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. hdu 1005:Number Sequence(水题)

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. 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 ...

  9. HDU 1711 Number Sequence(数列)

    HDU 1711 Number Sequence(数列) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...

  10. HDU 1005 Number Sequence(数列)

    HDU 1005 Number Sequence(数列) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...

随机推荐

  1. jquery $.proxy使用 Jquery实现ready()的源码

    jquery $.proxy使用   在某些情况下,我们调用Javascript函数时候,this指针并不一定是我们所期望的那个.例如: 1 //正常的this使用 2 $('#myElement') ...

  2. Android创建和使用数据库

    一.关系型数据库SQLIte         每一个应用程序都要使用数据.Android应用程序也不例外,Android使用开源的.与操作系统无关的SQL数据库-SQLite. SQLite第一个Al ...

  3. Webkit二:RenderTree 创建

    RenderObject 作为所有Render 树节点的基类,完全类似与DOM树中的Node基类,它是构成Render 树的基础,作用非比寻常,其中包含了构成Render 树所可能涉及到的一些基本属性 ...

  4. 【重磅干货】看了此文,Oracle SQL优化文章不必再看!

    目录 SQL优化的本质 SQL优化Road Map 2.1 制定SQL优化目标 2.2 检查执行计划 2.3 检查统计信息 2.4 检查高效访问结构 2.5 检查影响优化器的参数 2.6 SQL语句编 ...

  5. LookAround开元之旅

    http://blog.csdn.net/lancees/article/details/17696805

  6. slidemenu

    1. 在github上有一个效果不错的开源库,SlidingMenu 最新的代码下载下来后,会报错: No resource found that matches the given name: at ...

  7. HDU 6166 Senior Pan 二进制分组 + 迪杰斯特拉算法

    Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Probl ...

  8. RabbitMQ 基础

    Windows下安装RabbitMq 下载RabbitMq 安装参考 http://www.rabbitmq.com/install-windows.html 下载Erlang Erlang 下载安装 ...

  9. 九度OJ 1097:取中值 (中值)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5092 解决:1411 题目描述: 存在两组数组,和4个数字a,b,c,d,要求做如下操作,将第一个数组第a个数到第b个数,第二个数组的第c ...

  10. The server must be started under an unprivileged user ID to prevent

    mysql8 PostgreSQL [root@test local]# postgres -D /usr/local/pgsql/data"root" execution of ...