Luogu P9510 『STA - R3』高维立方体 题解

题目传送门

没见过这玩意,写个题解记下。

题目大意

周知斐波那契数列定义为:

fib(n)={1n2fib(n1)+fib(n2)n>2

然后定义(n0 函数值为 0

f(n)=i=1nfib(i)

你需要求出:

i=1nfib(i)(f(i2)+fib2(i)+fib(i))

数据范围 n1018,数据组数 T2×105,模数 2p109+7

题目解析

第一次见这种题目,记录一下。


从这张图我们可以得到

f(n)=i=1n(fib(i))2=fib(n)fib(n+1)

然后就是化式子

i=1nfib(i)(f(i2)+fib2(i)+fib(i))展开f(x)=i=1nfib(i)(fib(i2)fib(i1)+fib2(i)+fib(i))乘开,提出fib2(i)=i=1n(fib(i)fib(i1)fib(i2)+fib3(i))+i=1nfib2(i))左边带入fib(i2)=fib(i)fib(i1),右边带入上述公式=i=1n(fib(i)fib(i1)(fib(i)fib(i1))+fib3(i))+fib(n)fib(n+1)乘开=i=1n(fib2(i)fib(i1)fib(i)fib2(i1)+fib3(i))+fib(n)fib(n+1)提取公因式fib2(i)=i=1n(fib2(i)(fib(i1)+fib(i))fib(i)fib2(i1))+fib(n)fib(n+1)合并fib(i1)+fib(i)=fib(i+1)=i=1n(fib2(i)fib(i+1)fib2(i1)fib(i))+fib(n)fib(n+1)裂项相消=fib2(n)fib(n+1)fib2(0)fib(1)+fib(n)fib(n+1)通过fib(n)=fib(n1)+fib(n2)逆推得到fib(0)=0并带入=fib2(n)fib(n+1)+fib(n)fib(n+1)

矩阵乘法一次就可以同时算出 fib(n)fib(n+1)
时间复杂度 O(Tlogn)

ll n,p;
struct Mat{
ll a11,a12,a21,a22;
Mat operator * (const Mat y) const {
return (Mat){(this->a11*y.a11+this->a12*y.a21)%p,
(this->a11*y.a12+this->a12*y.a22)%p,
(this->a21*y.a11+this->a22*y.a21)%p,
(this->a21*y.a12+this->a22*y.a22)%p};
}
}st,base;
Mat pow(Mat x,ll y){
Mat res,tmp=x; res.a11=res.a22=1; res.a12=res.a21=0;
while(y){ if(y&1) res=res*tmp; tmp=tmp*tmp; y>>=1; } return res;
}
void work(){
fin>>n>>p; if(n==1){ fin<<2%p<<'\n'; return; }
st.a11=1; st.a12=1; base.a12=1; base.a21=1; base.a22=1;
st=(st*pow(base,n-1));
fin<<(st.a11+1)*st.a11%p*st.a12%p<<'\n';
}
int main(){
int T; fin>>T; while(T--) work(); return 0;
}
posted @   jiangtaizhe001  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示