首页 技术 正文
技术 2022年11月20日
0 收藏 618 点赞 3,876 浏览 1860 个字

题意:已知斐波那契数列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 ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,031
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,520
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,368
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,148
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,781
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,859