首页 > 其他分享 >P5175 题解

P5175 题解

时间:2023-07-09 18:45:19浏览次数:55  
标签:题解 ans 矩阵 long bmatrix P5175 trans mod

题意简述

给出数列 \({a_n}(1\le n\le10^{18})\) 的两项 \(a_1,a_2\) 与递推公式 \(a_n=xa_{n-1}+ya_{n-2}\),求:

\[S_n=\sum_{k=1}^{n}a_k^2\mod (10^9+7) \]

题目分析

一看见 \(1\le n\le 10^{18}\),就大概能知道要用 \(O(\log n)\) 级别的算法。再一看递推,就知道要用矩阵快速幂了。

题目所求的答案是前 \(n\) 项的 \(a_k^2\) 之和,如果我们能快速求出每个 \(a_k^2\),那么再用矩阵快速幂递推求和是十分简单的。

注意到 \(a_{k+1}=xa_k+ya_{k-1}\),那么就有 \(a_{k+1}^2=x^2a_k^2+y^2a_{k-1}^2+2xya_{k}a_{k-1}\),如果我们维护了 \(a_k^2\) 与 \(a_{k-1}^2\),就可以递推地求出 \(a_{k+1}^2,a_{k+2}^2\) 等等。

还没完,注意到 \(a_{k+1}\) 展开后还有一项 \(2xya_{k}a_{k-1}\),去掉系数就还剩下 \(a_{k}a_{k-1}\)。维护它应该怎么处理呢?将 \(a_k\) 拆开得到 \(a_{k}a_{k-1}=(xa_{k-1}+ya_{k-2})a_{k-1}=xa_{k-1}^2+ya_{k-1}a_{k-2}\),其中 \(a_{k-1}^2\) 已经维护了,所剩的只有 \(ya_{k-1}a_{k-2}\)。这就意味着我们维护每一个 \(a_{k}a_{k-1}\) 就可以求出 \(a_{k+1}a_k\) 和 \(a_{k+2}a_{k+1}\) 等等。

综上,我们使用答案矩阵
\(\begin{bmatrix} S_{k} & a_k^2 & a_{k-1}^2 & a_ka_{k-1} \end{bmatrix}\) 进行维护。初始值为
\(\begin{bmatrix} S_{2}=a_1^2+a_2^2 & a_2^2 & a_1^2 & a_2a_1 \end{bmatrix}\)。

为了将其递推到 \(\begin{bmatrix} S_{k+1} & a_{k+1}^2 & a_{k}^2 & a_{k+1}a_k \end{bmatrix}\),需要有一个转移矩阵:

\[\begin{bmatrix} 1 & 0 & 0 & 0\\ x^2 & x^2 & 1 & x\\ y^2 & y^2 & 0 & 0\\ 2xy & 2xy & 0 & y \end{bmatrix}\]

我们一列一列地进行解释。

对于第 \(2\) 列,有 \(a_{k+1}^2=0S_k+x^2a_k^2+y^2a_{k-1}^2+2xya_ka_{k-1}\)。

那么对于第 \(1\) 列,有 \(S_{k+1}=S_k+a_{k+1}^2=1S_k+x^2a_k^2+y^2a_{k-1}^2+2xya_ka_{k-1}\)。

对于第 \(3\) 列,有 \(a_k^2=0S_k+1a_k^2+0a_{k-1}^2+0a_ka_{k-1}\),没什么可解释的。

对于第 \(4\) 列,有 \(a_{k+1}a_k=0S_k+xa_k^2+0a_{k-1}^2+ya_ka_{k-1}\)。

现在我们只需要计算出转移矩阵的 \(n-2\) 次幂,再乘到答案矩阵上就好了。

需要注意的是要特判 \(n=1\),否则会挂掉。然后就是该开 long long 的地方一定要开,不然也会挂。

分析一下时间复杂度。一次矩阵乘法是 \(O(4^3)=O(64)\),因此矩阵快速幂的时间复杂度为 \(O(64\log n)\),总复杂度为 \(O(64T\log n)\),在 \(T\le 3\times 10^4,1\le n\le 10^{18}\),时限 \(1.50s\) 的情况下用个快读快写就可以过了。

代码实现

#include<bits/stdc++.h>
using namespace std;
const long long mod=1000000007;
int t;
long long n,x,y,a1,a2;
void rd(long long &x)
{
	x=0ll;
	char c=getchar();
	for(;c>'9'||c<'0';c=getchar());
	for(;c<='9'&&c>='0';c=getchar())
		x=(x<<3ll)+(x<<1ll)+c-'0';
}//long long快读 
void rd(int &x)
{
	x=0;
	char c=getchar();
	for(;c>'9'||c<'0';c=getchar());
	for(;c<='9'&&c>='0';c=getchar())
		x=(x<<3)+(x<<1)+c-'0';
}//int快读 
void pt(long long x)
{
	if(x>=10ll)
		pt(x/10ll);
	putchar(x%10ll+'0');
}//快写 
struct matrix
{
	int n,m;
	long long a[5][5];
	void init(long long k)
	{
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				if(i!=j)
					a[i][j]=0ll;
				else
					a[i][j]=k;
	}//初始化 k=0零矩阵,k=1单位矩阵 
	friend matrix operator *(matrix a,matrix b)
	{
		matrix c;
		c.n=a.n,c.m=a.m;
		c.init(0ll);
		for(int i=1;i<=a.n;i++)
			for(int k=1;k<=a.m;k++)
				for(int j=1;j<=b.m;j++)
					c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j]%mod)%mod;
		return c;
	}//矩阵乘法 
	friend matrix operator ^(matrix a,long long b)
	{
		matrix res;
		res.n=res.m=a.n;
		res.init(1ll);
		for(;b;b>>=1ll)
		{
			if(b&1ll)
				res=res*a;
			a=a*a;
		}
		return res;
	}//矩阵快速幂 
}ans,trans;
int main()
{
	rd(t);
	while(t--)
	{
		rd(n),rd(a1),rd(a2),rd(x),rd(y);
		if(n==1ll)//特判 n=1,不然会 T 得很惨
		{
			pt(a1*a1%mod);
			putchar('\n');
			continue;
		}
		ans.n=1,ans.m=4;
		ans.a[1][1]=(a2*a2%mod+a1*a1%mod)%mod,ans.a[1][2]=a2*a2%mod,ans.a[1][3]=a1*a1%mod,ans.a[1][4]=a1*a2%mod;//初始化答案矩阵 
		trans.n=trans.m=4;
		trans.init(0ll);
		trans.a[2][1]=trans.a[2][2]=x*x%mod,trans.a[3][1]=trans.a[3][2]=y*y%mod,trans.a[4][1]=trans.a[4][2]=2ll*x*y%mod;
		trans.a[1][1]=trans.a[2][3]=1ll;
		trans.a[2][4]=x,trans.a[4][4]=y;//初始化转移矩阵 
		trans=trans^(n-2ll);//转移矩阵快速幂 
		ans=ans*trans;//答案矩阵乘上转移矩阵 
		pt(ans.a[1][1]);
		putchar('\n');
	}
	return 0;
}

标签:题解,ans,矩阵,long,bmatrix,P5175,trans,mod
From: https://www.cnblogs.com/hadtsti/p/P5175-solution.html

相关文章

  • AT2402 题解
    题意简述给你\(n\)杯水,第\(i\)杯的水温为\(t_i\),容量为\(v_i\),依次倒入容量为\(V\)的大盆。注意每次倒入水后盆内水的总体积必须恒定为\(V\),且每杯水必须全部倒入,因此为防止倒进水时溢出,在倒水之前可以从盆里往外倒出一些水。求每次倒进水后盆里水温度的最大值(每次计算......
  • P4819 题解
    题意简述\(n\)个居民中有一名杀手,有些居民知道其他一些人的身份是杀手还是平民,该类条件共\(m\)条。现在警方要询问一些居民来获得其他人的信息,要求在能够从已知条件推断出杀手是谁的前提下询问尽可能少的人。然而每个居民是杀手的概率都是\(\frac{1}{n}\),因此警方询问的居民......
  • redis雪崩问题解决
    缓存雪崩出现的场景缓存服务器宕机,没有设置持久化介绍:缓存服务器宕机,没有设置持久化,导致缓存数据全部丢失,请求全部转发到数据库,造成数据库短时间内承受大量请求而崩掉。缓存集中失效缓存的key设置了相同的过期时间,导致在某一时刻,大量的key同时失效,请求全部转发到数据库,造成......
  • gym 102994M Travel Dream 题解
    给定带权无向图,求最大\(k\)元环。\(n,m\leq300,3\leqk\leq10\),无重边。把\(k=3\)判掉,可以\(O(m^2)\)轻松解决。把\(k\)元环拆成长度为\(\dfrac{k}{2}-1\)的链\(+\)长度\(k-\dfrac{k}{2}-1\)的链\(+\)连接两条链的两条边。(长度指边的个数)问题:两条链需要无......
  • 「NOIP 模拟赛 20230709」T3 - 与行星相会 题解
    题目大意原题有一个\(n\timesn\)的点阵,将相邻的点连边得到一个\((n-1)\times(n-1)\)的网格。\(q\)次操作,每次删掉一条边,求删掉后边两端的点是否仍在一个连通块内。强制在线。题解显然,由于对偶图的性质,原图的一个割对应对偶图中的一个环,所以只需要删掉一条边时在对偶图中......
  • 寻找页码题解
    首先看题目,我也不知道这一题的出处。。。。在网上找了很久也没找到。。。题目描述从第1页开始,页码组成的数字序列如下:123..101112..99100101...这串序列又被称之为连写数。给定一个0到9之中的单独一位数字a,请问在这串序列中,第k次出现a,是在哪一页上?以数码1为例,第......
  • 华泰证券FINTECH决赛第二题题解
    被第二题搞得坐牢2个半小时,在最后10分钟才确定推出的求和公式没问题,是除法取模不规范导致求解有偏差,只能说菜是原罪。这里贴一下赛后修改的代码,希望能对列位有些帮助,欢迎巨佬指导。思路:分奇偶讨论固定长度下伪回文串的数量,定义长度为\(n\)的伪回文串的数量为\(a_{n}\):(1)\(n\)......
  • P7112 题解
    题意简述模板题,求一个\(n\timesn(n\le600)\)的方阵的行列式模一个正整数\(p(1\lep\le10^9+7)\)的值(\(p\)不一定是质数)。题目分析这个题的最终代码其实很简单,重点在于过程。说实话,我在做这个题之前也就只知道个行列式的定义,只会暴力硬算。做了这个题才了解了行列式有那......
  • 关于Azure-平台-Redhat-Linux-服务器时间同步的问题解决
    首先说明一下,关于Azure平台中国区,是没有RedhatLinux系统镜像的于是笔者这边是通过在Windows系统 Hyper-V管理器中安装完Redhat8.x操作系统后,最后将系统磁盘转换成转换为VHD格式然后经过一系列操作、最终在Azure平台上形成了自己的并且加固过的RedHatEnterpriseLinuxre......
  • 【题解】 [APIO2007] 动物园
    目录题目链接原题描述题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2提示题意概括思路历程1.与环相关2.设计状态代码实现题目链接原题描述[APIO2007]动物园题目描述新建的圆形动物园是亚太地区的骄傲。圆形动物园坐落于太平洋的一个......