【题解】递归数列

【题解】递归数列"题目链接"题目大意:给定序列迭代规则,求一段的序列和。特点是要求的序列很长。Solution观察到,由于是求和,我们可以想到前缀和的思想。也就是说,对于求$\sum_{i=

大家好,又见面了,我是你们的朋友全栈君。

题目链接

题目大意:给定序列迭代规则,求一段的序列和。特点是要求的序列很长。

Solution#

观察到,由于是求和,我们可以想到前缀和的思想。也就是说,对于求\(\sum_{i=m}^n a_i\),我们只需要求\(\sum_{i=1}^{m-1}a_i\)\(\sum_{i=1}^n a_i\),然后做差即可。

注意到\(n,m\)的范围,我们线性递推是不现实的。于是我们可以考虑矩阵快速幂。

考虑维护\(k+1\)个值。维护\(k\)个序列基本值,以及一个求和值。我们根据\(k\)个信息推出下一个信息。观察到\(k\)的范围,所以是可以做的。

构造矩阵比较简单。注意一下\(c\)的位置,是倒序的。

由于我们一次维护的是\(k\)个值,所以,如果我们要求\(pos\),则我们求出转移矩阵的\(pos-k\)次方就可以求出。

两次矩阵快速幂加上前缀和思想,这题做完了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
typedef long long ll;
ll n,m,p,s,ss[16],Ans,sss;
inline ll add(ll x,ll y){return (x%p+y%p)%p;}
inline ll mul(ll x,ll y){return (x%p*y%p)%p;}
inline ll del(ll x,ll y){return x-y<0?x+p-y:x-y;}
int k,b[16],c[16];
struct Mat{
	ll A[17][17];
	Mat(){memset(A,0,sizeof(A));}
	Mat operator*(const Mat&B)const{
		Mat res;
		for(int i=1;i<=k+1;++i)
			for(int j=1;j<=k+1;++j)
				for(int l=1;l<=k+1;++l)
					res.A[i][j]=add(res.A[i][j],mul(A[i][l],B.A[l][j]));
		return res;
	}
}w,s1,A2,A1;
inline void Init(Mat &x){for(int i=1;i<=k+1;++i)x.A[i][i]=1;}
Mat qpow(Mat st,ll b){
	Mat c;
	Init(c);
	while(b){
		if(b&1)c=c*st;
		b>>=1;st=st*st;
	}
	return c*s1;
}
signed main(){
	scanf("%lld",&k);
	for(int i=1;i<=k;++i)scanf("%lld",&b[i]);
	for(int i=1;i<=k;++i)scanf("%lld",&c[i]);
	scanf("%lld%lld%lld",&m,&n,&p);
	for(int i=1;i<=k;++i)ss[i]=add(ss[i-1],(ll)b[i]);
	for(int i=1;i<=k;++i)s1.A[i][1]=b[i];
	s1.A[k+1][1]=ss[k];
	for(int i=1;i<k;++i)w.A[i][i+1]=1;
	for(int i=1;i<=k;++i)w.A[k][i]=c[k-i+1],w.A[k+1][i]=c[k-i+1];
	w.A[k+1][k+1]=1;
	if(m-1>=k)A1=qpow(w,m-1-k);
	else A1.A[k+1][1]=ss[m-1];
	if(n>=k)A2=qpow(w,n-k);
	else A2.A[k+1][1]=ss[n];
	Ans=del(A2.A[k+1][1],A1.A[k+1][1]);
	printf("%lld\n",Ans);
	return 0;
} 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155600.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 任意角和弧度制[通俗易懂]

    任意角和弧度制[通俗易懂]1importmath23PI=math.pi45defshow():6print(7'小主,(* ̄︶ ̄),请选择你需要的功能:\n'8'\t\0

  • Android Bundle类

    Android Bundle类

  • shiro框架—shiro配置介绍(一)

    shiro框架—shiro配置介绍(一)接上一篇文章shiro框架—关于用户登录和权限验证功能的实现步骤(二)shiro在springboot项目中的配置步骤1、引入依赖  首先shiro的应用,引入的依赖仅仅只有一个,即下边这个。&amp;amp;amp;amp;lt;dependency&amp;amp;amp;amp;gt;&amp;amp;amp;amp;lt;groupId&amp;amp;amp;amp;gt;org.apache.shiro&amp;amp

  • 最新Hadoop的面试题总结[通俗易懂]

    最新Hadoop的面试题总结[通俗易懂]1、集群的最主要瓶颈 磁盘IO2、Hadoop运行模式 单机版、伪分布式模式、完全分布式模式3、Hadoop生态圈的组件并做简要描述 1)Zookeeper:是一个开源的分布式应用程序协调服务,基于zookeeper可以实现同步服务,配置维护,命名服务。 2)Flume:一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统。 3)Hbase:是一个分布式的、面向列的开源数据库,利用HadoopHDFS作为其存储系统。 4)Hive:基于Hadoop的一个数据仓库工具

  • Dell服务器误删阵列恢复操作

    Dell服务器误删阵列恢复操作确认机器是否阵列(此例为阵列五)已丢失,然后配置idrac配置完成退出BIOS,让机器自然运行,进不去系统没关系正常磁盘掉线状态为Foreign,目前操作是误删了阵列所以磁盘全为ready模式,Foreign那块是后加的raid0(导回即可)这边机器退出BIOS开机以后,需要idrac收集一份日志(日志系统日志与存储日志)然后排查日志,发现日志有删除动作,但是没有格式化磁盘(应该是误删操作)在误删阵列,但是没有格式化的情况下啊,大概率实现资料恢复(先确认机器之前是什.

  • VBScript经典教程以及函数手册

    VBScript经典教程以及函数手册   Vbs经典教程:   https://www.jb51.net/article/53280.htm   Vbs函数手册:   https://www.jb51.net/shouce/vbs/

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号