Codeforces 392C Yet Another Number Sequence (矩阵快速幂+二项式展开)
题意:已知斐波那契数列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 (矩阵快速幂+二项式展开)的更多相关文章
- 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\). ...
- UVA - 10689 Yet another Number Sequence 矩阵快速幂
Yet another Number Sequence Let’s define another number sequence, given by the foll ...
- Yet Another Number Sequence——[矩阵快速幂]
Description Everyone knows what the Fibonacci sequence is. This sequence can be defined by the recur ...
- 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 ...
- HDU - 1005 Number Sequence 矩阵快速幂
HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ...
- 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 ...
- 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 ...
- SDUT1607:Number Sequence(矩阵快速幂)
题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1607 题目描述 A number seq ...
- bzoj5015 [Snoi2017]礼物 矩阵快速幂+二项式展开
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5015 题解 设 \(f_i\) 表示第 \(i\) 个朋友的礼物,\(s_i\) 表示从 \( ...
随机推荐
- 用DotRas来连接VPN网络
最近要用程序来不断的连接VPN(为什么要这样就不讨论了),开始用的是如下代码: public static bool ADSL() { bool flag = true; do { Console.W ...
- WPF移动Window窗体(鼠标点击左键移动窗体自定义行为)
XAML代码部分:1.引用System.Windows.Interactivity 2.为指定的控件添加一个拖动的行为 3.很简单的了解行为的作用和用法 <Window xmlns=" ...
- Flex 布局教程
今天给大家分享一下flex布局的语法 网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于 ...
- 《深入理解Java虚拟机》学习笔记之字节码执行引擎
Java虚拟机的执行引擎不管是解释执行还是编译执行,根据概念模型都具有统一的外观:输入的是字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果. 运行时栈帧结构 栈帧(Stack Frame) ...
- spring exception
Spring MVC异常处理SimpleMappingExceptionResolver[转] (2012-12-07 13:45:33) 转载▼ 标签: 杂谈 分类: 技术分享 Spring3.0中 ...
- SQL Server-字字珠玑,一纸详文,完全理解SERIALIZABLE最高隔离级别(基础系列收尾篇)
前言 对于上述锁其实是一个老生常谈的话题了,但是我们是否能够很明确的知道在什么情况下会存在上述各种锁类型呢,本节作为SQL Server系列末篇我们 来详细讲解下. Range-Lock 上述关于Ra ...
- 学习H5一周随笔
H5学习也已经进行了一个周了,除了学习过程中的乱哄哄的脑子,对H5初学者(我)常见的问题有了如下见解. 1.初学者在建立新的Html文件之后,有时候会把 <meta charset=" ...
- java 限定控制台输入值的类型
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader; public cl ...
- 队列工厂之(MSMQ)
最近vs2017神器正式版发布让人很是激动,vs2017支持了很多语言的开发,从前端-后端-底层的支持,堪称是工具中的神器:netcore我喜爱的架构之一也得到了大力的宣传,应群友的邀请将在队列工厂( ...
- ACM 序号互换
序号互换 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 Dr.Kong设计了一个聪明的机器人卡多,卡多会对电子表格中的单元格坐标快速计算出来.单元格的行坐标是由数字 ...