题意:已知斐波那契数列fib(i) , 给你n 和 k , 求∑fib(i)*ik (1<=i<=n)

思路:不得不说,这道题很有意思,首先我们根据以往得出的一个经验,当我们遇到 X^k 的形式,当 X 很大,k很小时,我们可以利用二项式定理进行展开,然后求出递推式在利用矩阵加速

推导过程:

已知 fib(1) = 1, fib(2) = 1,fib(i) = fib(i-1) + fib(i-2);

Ai(k) =fib(i)*i^k;

根据数学归纳法,我们可知 fib(i+1)*(i+1)^k = ( fib(i) + fib(i-1) ) * (i+1)^k 必然成立

将上式进行二项式展开

上式 = ( fib(i) + fib(i-1) ) * {C[k][0]*i^0 + C[k][1]*i^1 +...+C[k][k]*i^k};

= C[k][0]*(i^0* fib(i) + i^0*fib(i-1) ) + C[k][1]*(i^1* fib(i) + i^1*fib(i-1) )....(乘法结合律

我们定义 g1[i][a] = fib(i)*i^a , g2[i][a] = fib(i-1)*i^a

将定义的g1 , g2 带入上式中得到递推公式

g1[i][k] = C[k][0]*(g1[i-1][0]+g2[i-1][0])+C[k][1]*(g1[i-1][1]+g2[i-1][1])+...+C[k][k](g1[i-1][k]+g2[i-1][k]);

g2[i][k]= C[k][0]*g1[i-1][0] +C[k][1]*g1[i-1][1]+..+C[k][k]*g1[i-1][k];

最后再根据递推式写出构造矩阵即可

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#define ll long long
using namespace std;
ll N,M,P;
const ll MOD=;
ll C[][];
struct Matrix
{
ll m[][];
}; Matrix A; Matrix I; void get_C()
{
memset(C,,sizeof(C));
C[][]=;
for(int i=;i<=;i++)
{
C[][i]=C[i][i]=;
for(int j=;j<=i;j++)
{
C[j][i]=(C[j][i-]+C[j-][i-])%MOD;
}
}
} void make_I(int k)
{
memset(I.m,,sizeof(I.m));
for(int i=;i<=*(k+);i++)
for(int j=;j<=*(k+)+;j++)
if(i==j)
I.m[i][j]=;
} void make_A(int k)
{
memset(A.m,,sizeof(A.m));
for(int i=;i<=k;i++)
{
for(int j=;j<=i;j++)
{
A.m[i][j]=C[j][i];
}
}
for(int i=;i<=k;i++)
{
for(int j=;j<=i;j++)
{
A.m[i+k+][j]=C[j][i];
}
}
for(int i=;i<=k;i++)
{
for(int j=k+;j<=*(k+)-;j++)
{
A.m[i][j]=C[j-k-][i];
}
}
A.m[*(k+)][k]=;
A.m[*(k+)][*(k+)]=;
} Matrix multi(Matrix a,Matrix b)
{
Matrix ans;
for(int i=;i<=N;i++)
{
for(int j=;j<=M;j++)
{
ans.m[i][j]=;
for(int k=;k<=P;k++)
{
ans.m[i][j]=(ans.m[i][j]+a.m[i][k]*b.m[k][j])%MOD;
}
ans.m[i][j]%=MOD;
}
}
return ans;
} Matrix power(Matrix a,ll k)
{
Matrix ans=I,p=a;
while(k)
{
if(k&)
{
ans=multi(ans,p);
}
k>>=;
p=multi(p,p);
}
return ans;
} int main()
{
ll n;
int k;
get_C();
while(cin>>n>>k)
{
if(n==)
{
cout<<""<<endl;
continue;
}
else
{
make_A(k);
make_I(k);
N=M=P=*(k+);
Matrix ans = power(A,n);
ll num=;
for(int i=;i<M;i++)
num=(num+ans.m[*(k+)][i])%MOD;
cout<<num<<endl;
}
}
return ;
}

Codeforces 392C Yet Another Number Sequence (矩阵快速幂+二项式展开)的更多相关文章

  1. CodeForces 392C Yet Another Number Sequence 矩阵快速幂

    题意: \(F_n\)为斐波那契数列,\(F_1=1,F_2=2\). 给定一个\(k\),定义数列\(A_i=F_i \cdot i^k\). 求\(A_1+A_2+ \cdots + A_n\). ...

  2. UVA - 10689 Yet another Number Sequence 矩阵快速幂

                      Yet another Number Sequence Let’s define another number sequence, given by the foll ...

  3. Yet Another Number Sequence——[矩阵快速幂]

    Description Everyone knows what the Fibonacci sequence is. This sequence can be defined by the recur ...

  4. HDU 1005 Number Sequence(矩阵快速幂,快速幂模板)

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

  5. HDU - 1005 Number Sequence 矩阵快速幂

    HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...

  6. HDU - 1005 -Number Sequence(矩阵快速幂系数变式)

    A number sequence is defined as follows:  f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) m ...

  7. Yet another Number Sequence 矩阵快速幂

    Let’s define another number sequence, given by the following function: f(0) = a f(1) = b f(n) = f(n ...

  8. SDUT1607:Number Sequence(矩阵快速幂)

    题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1607 题目描述 A number seq ...

  9. bzoj5015 [Snoi2017]礼物 矩阵快速幂+二项式展开

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5015 题解 设 \(f_i\) 表示第 \(i\) 个朋友的礼物,\(s_i\) 表示从 \( ...

随机推荐

  1. DevExpress 控件使用之GridControl基本属性设置

    DEV控件:gridControl常用属性设置     1.隐藏最上面的GroupPanel(实现方法两种)     ①代码实现:gridView1.OptionsView.ShowGroupPane ...

  2. 2017-2-23 C#基础 for循环

    循环语句主要有:for;while;foreach.最常用的是for循环.for循环的四要素:初始条件:循环条件:循环体:状态改变.for循环的顺序是:初始条件--循环条件--循环体--状态改变.br ...

  3. 强化学习读书笔记 - 02 - 多臂老O虎O机问题

    # 强化学习读书笔记 - 02 - 多臂老O虎O机问题 学习笔记: [Reinforcement Learning: An Introduction, Richard S. Sutton and An ...

  4. Javascript学习十

    认识DOM 文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 先来看看下面代码 ...

  5. css中的那些布局

    因为最近心血来潮,就总结了一下css中的几种常见的多列布局. 两列自适应布局 两列自适应布局算是css布局里面最基础的一种布局了,不少网站在使用. 这种布局通常是左侧固定,右边自适应,当然也有反过来的 ...

  6. 【转载】JavaScript继承详解一

    面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++.C#.Java)的开发经验. 在传统面向对象的语言中,有两个非常重要的概念 - 类和实例. 类定义了一类事物公共的行为和方法:而实例则 ...

  7. ERP实施员的保密要求

    一.公司机密文件范围 1    公司级计算机密码 2    公司级程序软件 3    与客户联系的各种远程联系用户名,密码 4    公司发展计划.规划 5    公司客户资料.财务报表.人事薪资.报 ...

  8. Python3.5 numpy,scipy,安装

    不是特别难,先保证环境变量正确配置 首先,安装了VS2015; 第二,在Python3.5安装路径中有一个Scripts文件夹,里面有pip.exe或者类似的可执行文件,安装一下: 第三,下载相对应的 ...

  9. 利用内核cgroup机制轻松实现类似docker的系统资源管控

    近几年,以docker为代表的容器技术异常火热,它的轻量.高效让人欣喜若狂,它被赋予了改变传统IT运维的使命.相信随着时间推移,以容器云为落地形式的产品将真正实现这一使命. 我们都知道docker能够 ...

  10. 黑苹果引导工具 Clover 配置详解及Clover Configurator使用

    黑苹果引导工具 Clover 配置详解及Clover Configurator使用  2017-03-11 14:01:40 by SemiconductorKING 转自:@三个表哥   简介: 可 ...