CF392C Yet Another Number Sequence 题解
题意:
斐波那契数列
解题思路
发现
接着思考如何构建操作矩阵
AC代码
(码风不好不喜勿喷)
#include<iostream>
#include<algorithm>
#include<vector>
#define int long long
using namespace std;
const int mod=1e9+7;
struct Matrix{//矩阵结构体
vector<vector<int> > mp;
Matrix(int n,int val=0):mp(n,vector<int>(n,0)){
for(int i=0;i<n;i++) mp[i][i]=val;
}
Matrix(const vector<vector<int> >& _m):mp(move(_m)){}
Matrix operator*(const Matrix& _m)const{
int n=mp[0].size();
Matrix res(n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
for(int k=0;k<n;k++)
res.mp[i][j]=(res.mp[i][j]+mp[i][k]*_m.mp[k][j])%mod;
return res;
}
Matrix operator^(int l){
Matrix res(mp.size(),1),tmp=*this;
while(l){
if(l&1) res=res*tmp;
tmp=tmp*tmp;
l>>=1;
}
return res;
}
};
int n,k,ans;
signed main(){
scanf("%lld%lld",&n,&k);
if(n==1){
printf("1");
return 0;
}
if(n==2){
printf("%lld",1+2*(1<<k));
return 0;
}//特判小于等于二的情况
Matrix C((k<<1)+3);
C.mp[0][k+1]=1;
for(int i=1;i<k+1;i++){
for(int j=k+1;j<(k<<1)+2;j++){
if(j==k+1) C.mp[i][j]=1;
else C.mp[i][j]=(C.mp[i-1][j-1]+C.mp[i-1][j])%mod;
}
}
C.mp[k+1][0]=C.mp[k+1][k+1]=1;
for(int i=k+2;i<(k<<1)+2;i++){
for(int j=0;j<k+1;j++){
if(j==0) C.mp[i][j]=C.mp[i][j+k+1]=1;
else C.mp[i][j]=C.mp[i][j+k+1]=(C.mp[i-1][j-1]+C.mp[i-1][j])%mod;
}
}
for(int i=0;i<(k<<1)+2;i++) C.mp[(k<<1)+2][i]=C.mp[(k<<1)+1][i];
C.mp[(k<<1)+2][(k<<1)+2]=1;//创建操作矩阵C
C=C^(n-1);//矩阵快速幂
for(int i=0;i<(k<<1)+3;i++) ans=(ans+C.mp[(k<<1)+2][i])%mod;//统计答案
printf("%lld",ans%mod);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?