题意:

$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. String,StringBuilder性能对照

    import java.util.Date; import java.util.UUID; /**  * 測试String,StringBuilder性能,推断什么时候改用String,什么时候该用S ...

  2. mysql 分表的3种方法

    http://blog.51yip.com/mysql/949.html       CSDN - Mysql MERGE分表对大数据量的处理     实战经验: 要分表的表引擎必须是myisam类型 ...

  3. Ubuntu 16.04下配置Golang开发环境

    安装之前先要明白两个变量,后面介绍安装时,会用这两个变量 GOROOT   , 这是go的工作目录,比如 /home/[替换为你的用户名]/go/work GOPATH    , 这是go的安装目录, ...

  4. 编程算法 - 多重部分和问题 代码(C)

    多重部分和问题 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 有n种不同大小的数字a, 每种各m个. 推断能否够从这些数字之中选出若干使它们的 ...

  5. Python--常用模块部分

    模块 pip install #模块名称 #安装模块 #导入模块 from collections import namedtuple collections模块 提供了几个额外的数据类型: Coun ...

  6. kubernetes调度之资源耗尽处理配置

    系列目录 本篇将介绍如何使用kubelet处理资源耗尽的情况 当可用的计算机资源非常低的时候,kubelet仍然要保证节点的稳定性.当处理不可压缩的计算机资源(比如内存或磁盘空间)时,这尤其重要,当这 ...

  7. 科学计算 | Matlab 使用 GPU 并行计算

    科学计算 | Matlab 使用 GPU 并行计算 本文转载自:  https://sanwen8.cn/p/14bJc10.html       Matlab下直接使用GPU并行计算(预告)< ...

  8. iOS9新特性之新添加的关键字

    iOS9 新出的关键字:用来修饰属性,或者方法的参数,返回值 好处:1.迎合swift 2.提高我们开发人员开发规范,减少程序员之间的交流 注意:iOS9新出的的关键字nonnull,nullable ...

  9. wepy开发

    工欲善其事必先利其器 ide安装.配置] https://tencent.github.io/wepy/document.html VS Code   1. 在 Code 里先安装 Vue 的语法高亮 ...

  10. [数据挖掘课程笔记]基于规则的分类-顺序覆盖算法(sequential covering algorithm)

    Rule_set = {}; //学习的规则集初试为空 for 每个类c do repeat Rule = Learn_One_Rule(D,Att-vals,c) 从D中删除被Rule覆盖的元组; ...