题意:已知斐波那契数列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. C#实体类生成XML与XML Schema文档

    一.实体类生成XML private void CreateXML() { Type[] objType = DBEntityRegst(); foreach (var item in objType ...

  2. Cloud9vue&vux上传github小步骤

    成功后创建出以下文件,再输入: git init 再输入:$ git remote add origin https://github.com/github用户名/vux1 然后:git add. 按 ...

  3. GPU渲染管线概述

    1.顶点着色器 顶点着色器是流水线的第一个阶段,它的输入来自于CPU.顶点着色器的处理单位是顶点,也就是说输入进来的每个顶点都会调用一次顶点着色器. 顶点着色器需要完成的工作主要有:坐标变换和逐顶点光 ...

  4. 北邮OJ

    90. 字符串转换 时间限制 1000 ms 内存限制 65536 KB 题目描述 我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而" ...

  5. 成为一名合格的ERP实施顾问应该具备哪些修为

    要想成为一个合格ERP实施顾问,究竟需要点什么素质.请注意,这里的素质与技能是两码事,素质特别强调的是某种修养,技能可以速成,修养必须积累沉淀. 快速切入客户业务的能力 作为一个合格的ERP实施人员, ...

  6. Insertion Sort List Leetcode

    Sort a linked list using insertion sort. 这个题我巧妙的设置了一个临时头结点 class Solution { public: ListNode* insert ...

  7. 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通

    1638: [Usaco2007 Mar]Cow Traffic 奶牛交通 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 618  Solved: 217 ...

  8. Levenshtein distance 编辑距离

    编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符 实现方案: 1. 找出最长 ...

  9. C#与Java区别(一)

    最近学了点java,总结了一些和c#的语法区别,欢迎大家指点和补充,如下: 1.java支持跨平台,当然.net core现在也支持. 2.java中用package,c#中用namespace定义空 ...

  10. .NET Core项目从xproj+project.json向csproj迁移简介

    3月7日,微软发布了Visual Studio 2017 RTM,与之一起发布的还有.NET Core Runtime 1.1.0以及.NET Core SDK 1.0.0,尽管这些并不是最新版,但也 ...