专栏文章
题解:CF392C Yet Another Number Sequence
CF392C题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioru5x6
- 此快照首次捕获于
- 2025/12/03 00:07 3 个月前
- 此快照最后确认于
- 2025/12/03 00:07 3 个月前
题目分析
首先,将题目中的式子简化成便于计算的形式:
发现是个递推式,同时 ,考虑使用矩阵加速递推。
设初始矩阵 为:
其中,第一个元素表示最终答案。那么,转移 步后, 应该为下面的矩阵:
那么,结合上面的递推式,我们能够得出转移矩阵 :
code
CPP#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using db=double;
using i128=__int128;
const int mod=1e9+7;
ll n,c[45][45],pw[45];
int m;
struct matrix{
vector<vector<ll>>a;
matrix(int n,int m,ll v){
a.resize(n,vector<ll>(m,v));
}
matrix operator *(const matrix &b)const{
int n=a.size(),m=a[0].size(),s=b.a[0].size();
matrix res(n,s,0);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
for(int k=0;k<s;k++)
res.a[i][k]=(res.a[i][k]+a[i][j]*b.a[j][k]%mod)%mod;
}
}
return res;
}
};
matrix power(matrix p,ll q){
matrix res(p.a.size(),p.a.size(),0);
for(int i=0;i<p.a.size();i++) res.a[i][i]=1;
while(q){
if(q&1) res=res*p;
p=p*p,q>>=1;
}
return res;
}
void solve(){
cin>>n>>m;
c[0][0]=1;
for(int i=1;i<=m;i++){
c[i][0]=1;
for(int j=1;j<=i;j++) c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
pw[0]=1;
for(int i=1;i<=m;i++) pw[i]=pw[i-1]*2%mod;
matrix e(2*(m+1)+1,2*(m+1)+1,0),ans(1,2*(m+1)+1,0);
e.a[0][0]=e.a[m+1][0]=1;
for(int i=1;i<=m+1;i++){
for(int j=1;j<=m+1;j++){
if(i>j) continue;
e.a[i][j]=c[j-1][i-1];
}
}
for(int i=m+2;i<=2*(m+1);i++){
for(int j=1;j<=m+1;j++){
if(i-m-1>j) continue;
e.a[i][j]=c[j-1][i-m-2]*pw[j-i+m+1]%mod;
}
}
for(int j=m+2;j<=2*(m+1);j++) e.a[j-m-1][j]=1;
for(int i=1;i<=m+2;i++) ans.a[0][i]=1;
e=power(e,n),ans=ans*e;
cout<<ans.a[0][0]<<'\n';
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
// cin>>T;
while(T--) solve();
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...