首页 > 其他分享 >Luogu P9510 『STA - R3』高维立方体 题解

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

时间:2023-08-19 10:11:15浏览次数:37  
标签:P9510 STA 题解 sum res fib text operatorname Mat

题目传送门

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

题目大意

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

\[\operatorname{fib}(n)=\left\{ \begin{aligned} 1 & & n\le 2 \\ \operatorname{fib}(n-1)+\operatorname{fib}(n-2) & & n>2 \end{aligned} \right. \]

然后定义(\(n\le 0\) 函数值为 \(0\))

\[f(n)=\sum_{i=1}^n \operatorname{fib}(i) \]

你需要求出:

\[\sum_{i=1}^{n}\operatorname{fib}(i)(f(i-2)+\operatorname{fib}^2(i)+\operatorname{fib}(i)) \]

数据范围 \(n\le 10^{18}\),数据组数 \(T\le 2\times 10^5\),模数 \(2\le p \le 10^9+7\)

\operatorname{fib}

题目解析

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


从这张图我们可以得到

\[f(n)=\sum_{i=1}^n \operatorname{fib}(i)=\operatorname{fib}(n)\operatorname{fib}(n+1) \]

然后就是化式子

\[\begin{aligned} & \sum_{i=1}^{n}\operatorname{fib}(i)(f(i-2)+\operatorname{fib}^2(i)+\operatorname{fib}(i)) \\ &\text{展开} f(x) \\ = & \sum_{i=1}^{n}\operatorname{fib}(i)(\operatorname{fib}(i-2)\operatorname{fib}(i-1)+\operatorname{fib}^2(i)+\operatorname{fib}(i))\\ &\text{乘开,提出}\sum \operatorname{fib}^2(i) \\ = & \sum_{i=1}^{n}(\operatorname{fib}(i)\operatorname{fib}(i-1)\operatorname{fib}(i-2)+\operatorname{fib}^3(i))+ \sum_{i=1}^n\operatorname{fib}^2(i))\\ &\text{左边带入} \operatorname{fib}(i-2)=\operatorname{fib}(i)-\operatorname{fib}(i-1)\text{,右边带入上述公式}\\ = & \sum_{i=1}^{n}(\operatorname{fib}(i)\operatorname{fib}(i-1)(\operatorname{fib}(i)-\operatorname{fib}(i-1))+\operatorname{fib}^3(i))+ \operatorname{fib}(n)\operatorname{fib}(n+1)\\ & \text{乘开} \\ = & \sum_{i=1}^{n}(\operatorname{fib}^2(i)\operatorname{fib}(i-1)-\operatorname{fib}(i)\operatorname{fib}^2(i-1)+\operatorname{fib}^3(i))+ \operatorname{fib}(n)\operatorname{fib}(n+1)\\ & \text{提取公因式} \operatorname{fib}^2(i) \\ = & \sum_{i=1}^{n}(\operatorname{fib}^2(i)(\operatorname{fib}(i-1)+\operatorname{fib}(i))-\operatorname{fib}(i)\operatorname{fib}^2(i-1))+ \operatorname{fib}(n)\operatorname{fib}(n+1)\\ & \text{合并} \operatorname{fib}(i-1)+\operatorname{fib}(i)=\operatorname{fib}(i+1) \\ = & \sum_{i=1}^{n}(\operatorname{fib}^2(i)\operatorname{fib}(i+1)-\operatorname{fib}^2(i-1)\operatorname{fib}(i))+ \operatorname{fib}(n)\operatorname{fib}(n+1)\\ & \text{裂项相消} \\ = & \operatorname{fib}^2(n)\operatorname{fib}(n+1)-\operatorname{fib}^2(0)\operatorname{fib}(1)+ \operatorname{fib}(n)\operatorname{fib}(n+1)\\\\ & \text{通过} \operatorname{fib}(n)=\operatorname{fib}(n-1)+\operatorname{fib}(n-2) \text{逆推得到} \operatorname{fib}(0)=0 \text{并带入}\\ = & \operatorname{fib}^2(n)\operatorname{fib}(n+1)+ \operatorname{fib}(n)\operatorname{fib}(n+1)\\ \end{aligned} \]

矩阵乘法一次就可以同时算出 \(\operatorname{fib}(n)\) 和 \(\operatorname{fib}(n+1)\)。
时间复杂度 \(O(T\log n)\)。

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;
}

标签:P9510,STA,题解,sum,res,fib,text,operatorname,Mat
From: https://www.cnblogs.com/jiangtaizhe001/p/17642087.html

相关文章

  • CF-1860C Game on Permutation题解
    题意:在一条数轴上,Alice可以跳到在你所在点前面且值比当前所在点小的点。每回合可以向任意符合要求的点跳一次。当轮到Alice的回合同时不存在符合要求的点,Alice就赢了。Alice可以选择一个点作为起始点,然后作为后手(赛时这里把我坑了)。问有多少个点是必胜的点。\(n\leq3\times10^5......
  • P6429 [COCI2008-2009#1] JEZ 题解
    题目传送门:Click。某蒟蒻看见这道题,想了足足一个晚上,过后茅塞顿开,故作此篇。感谢神犇的题解。看题目数据范围:\(1\leqr,c\leq10^6,1\leqk\leq10^{12}\),显然打暴力\(\mathcal{O}(rc)\)的时间复杂度是行不通的。必须做到近似于\(mathcal{O}(r)\)的时间复杂度。观察题......
  • [AGC004F] Namori 题解
    这里给出一种与其他题解完全不同的实现方式。思路发现图要么是一棵树,要么是一颗基环树。树我们首先考虑树如何操作。我们可以\(\text{dfs}\)这颗树。对于每个点维护一个\(w,h\),表示这个点想要变成白色\(w\)次,想要变成黑色\(h\)次。容易发现每个点最初状态都为\(w=0......
  • SyntaxError: /xxxx.vue: Unexpected token, expected “,“,[object Promise]export {
    本地老工程vue2.7.x+webpack4在升级webpack5的时候遇启动和打包报错:SyntaxError:SyntaxError:/xxxxx.vueUnexpectedtoken,expected","(1:8)>1|[objectPromise]|^2|export{render,staticRenderFns}最后才发现是prettier导致的。推荐看......
  • Centos7 install ZSH终端
    Centos的终端用起来太单一了。想着换成zsh终端,并配合ohmyzsh的主题。从而打造不一样的终端吧。安装ZSH我们可以用yum命令或者源码编译安装。(yum)安装的话可能zsh的版本较低。而很多主题都要用到更高版本的zsh,所以这里我使用的是源码安装。首先我们到zsh的官网下载最新版的zsh(http:......
  • Mike and strings 题解
    题目传送门一道字符串题。由于\(n\)非常小,可以暴力枚举字符串。我们可以枚举其中一个字符串\(s_i\),然后让其他的字符串变成\(s_i\),最后记录一下次数,取一个最小值即可。在枚举第二个字符串的时候可以将它再复制一份自己到后面,然后可以用find函数来统计。当然,如果找不到,这......
  • 洛谷_[P4084]Barn Painting G题解
    题目链接这题我们可以定义一个二维的dp数组,在dp[i][j]中:i表示对于节点i,j有1,2,3三种状态,表示当点i选择被染成颜色j时,以i为根的这颗子树有多少种染色方法。那么根据乘法原理,节点i的方案数肯定等于i的每个儿子的方案数量之积。这道题整个挺简单的,剩下细节......
  • 2023年 8月15日普及组南外集训题解
    A陷阱我们可以从\(l\)枚举到\(d\),再计算是否满足要求,满足要求加入到数组中,输出第一个和最后一个#include<iostream>usingnamespacestd;constintN=1e5+5;intk;intnums[N];intmain(){intl,d,x;cin>>l>>d>>x;for(inti=l;i<=d......
  • CF1806E 题解
    题目大意给你一棵树,然后定义一个函数$f(x,y)$,接下来给你$q$组询问\(x_{i},y_{i}\),让你求每一次的$f(x_{i},y_{i})$。分析首先我们尝试根据这个函数的定义暴力求值,代码实现如下。llBFquery(intg,inth){if(!g)return0;return1ll*a[g]*a[h]+BFquery(p......
  • P4005题解
    闲来无事写篇题解题面传送门简要题意一条线段上有\(n\)个点成对连接,求所连的线最小交点数。思路看到题目中\(n\le44\)自然想到最终复杂度大约在\(O(2^\frac{n}{2})\)左右。经过思考不难发现不论如何两地铁站之间有且只有以下八种方式进行连接:显然可以暴搜解决,......