P5110 块速递推-光速幂、斐波那契数列通项
P5110 块速递推
题意
多次询问,求数列
0 & i=0\\
1 & i=1\\
\end{cases}
\]
的第 \(n\) 项在 \(\mod 1e9+7\) 意义下的值的异或和。
思路
首先这个数列是一个广义斐波那契数列。对于广义斐波那契数列,我们一般是用矩阵快速幂求的。
但是,这个题的询问次数是 \(5e7\) 。
所以我们就必须用 \(O(1)\) 的方法处理询问。于是,一个自诩光速幂的东西登场了。
实际上,光速幂就是在 \(\sqrt n\) 的时间复杂度内预处理,然后 \(O(1)\) 查询。具体来讲,我们可以预处理出转移矩阵的 \(1、2、\cdots、\sqrt n\) 和 \(1\sqrt n、2\sqrt n、\cdots、\sqrt n \sqrt n\)
显然就可以 \(O(1)\) 求这个东西了。
但是!询问的数字大小肯定不是在模域范围内的,所以我们需要找循环节。
有一个问题就是,矩阵的循环节并不固定。
但是有一个结论,对角线元素互不相同的下三角矩阵的循环节为 \(\large\mathbf{\varphi_{mod}}\) 。但是笔者并不会证。
所以这题的正解并不是矩阵光速幂QAQ
我们可以用生成函数或者特征方程或者待定系数法来推出通项公式。具体推导过程与斐波那契数列的推导类似,然后用二次剩余将在根号下的项化成模域下的数,然后我们就得出了数列的通项公式:
\]
然而我用矩阵光速幂水过去了。
之后学了上面的东西之后可能会试着推一下。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define int unsigned
using namespace std;
inline int read(){
	int w=0,x=0;char c=getchar();
	while(!isdigit(c))w|=c=='-',c=getchar();
	while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return w?-x:x;
}
namespace star
{
	const int mod=1e9+7,ring=1e9+6,siz=31623;
	struct mat{
		int a[2][2];
		mat(){memset(a,0,sizeof a);}
		inline void set(){a[0][0]=a[1][1]=1;}
		inline int* operator [] (const int x){return a[x];}
		inline const int* operator [] (const int x) const {return a[x];}
		inline mat operator * (const mat &b)const{
			mat ans;
			for(int i=0;i<2;i++)
				for(int j=0;j<2;j++)
					for(int k=0;k<2;k++)
					(ans[i][j]+=1ll*a[i][k]*b[k][j]%mod)>=mod&&(ans[i][j]-=mod);
			return ans;
		}
	}now,pow[siz+1],Pow[siz+1];
	unsigned long long SA,SB,SC;
	void init(){scanf("%llu%llu%llu",&SA,&SB,&SC);}
	unsigned long long rand()
	{
	    SA^=SA<<32,SA^=SA>>13,SA^=SA<<1;
	    unsigned long long t=SA;
		SA=SB,SB=SC,SC^=t^SA;return SC;
	}
	inline void work(){
		now[0][1]=0,now[0][0]=1,pow[1][0][0]=233,pow[1][1][0]=666,pow[1][0][1]=1;
		pow[0].set();
		Pow[0].set();
		for(int i=2;i<=siz;i++)
			pow[i]=pow[i-1]*pow[1];
		Pow[1]=pow[siz];
		for(int i=2;i<=siz;i++)
			Pow[i]=Pow[i-1]*Pow[1];
		int T=read();
		init();
		unsigned ans=0;
		while(T--){
			int zp=rand()%ring;
			int x=zp/siz,y=zp%siz;
			int res;
			ans^=(res=(1ll*Pow[x][0][0]*pow[y][0][1]%mod+1ll*Pow[x][0][1]*pow[y][1][1]%mod))>=mod?res-=mod:res;
		}
		printf("%u\n",ans);
	}
}
signed main(){
	star::work();
	return 0;
}
												
											P5110 块速递推-光速幂、斐波那契数列通项的更多相关文章
- 递推-练习1--noi1760 菲波那契数列(2)
		
递推-练习1--noi1760 菲波那契数列(2) 一.心得 二.题目 1760:菲波那契数列(2) 总时间限制: 1000ms 内存限制: 65536kB 描述 菲波那契数列是指这样的数列: 数 ...
 - 牛客多校第九场 && ZOJ3774 The power of Fibonacci(二次剩余定理+斐波那契数列通项/循环节)题解
		
题意1.1: 求\(\sum_{i=1}^n Fib^m\mod 1e9+9\),\(n\in[1, 1e9], m\in[1, 1e4]\) 思路1.1 我们首先需要知道斐波那契数列的通项是:\(F ...
 - 洛谷 P5110 块速递推
		
题目大意: 给定一个数列a满足递推式 \(An=233*an-1+666*an-2,a0=0,a1=1\) 求这个数列第n项模\(10^9+7\)的值,一共有T组询问 \(T<=10^7\) \ ...
 - [P1306] 斐波那契公约数 (矩阵快速幂+斐波那契数列)
		
一开始数据没加强,一个简单的程序可以拿过 gcd(f[n],f[m])=f[gcd(n,m)] 下面这个是加强数据之后的80分代码 #include<bits/stdc++.h> usin ...
 - 洛谷P5110 块速递推 [分块]
		
传送门 思路 显然可以特征根方程搞一波(生成函数太累),得到结果: \[ a_n=\frac 1 {13\sqrt{337}} [(\frac{233+13\sqrt{337}}{2})^n-(\fr ...
 - P5110 块速递推
		
传送门 为啥我就没看出来有循环节呢-- 打表可得,这个数列是有循环节的,循环节为\(10^9+6\),然后分块预处理,即取\(k=sqrt(10^9+6)\),然后分别预处理出转移矩阵\(A\)的\( ...
 - Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
		
Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...
 - POJ3070 斐波那契数列递推 矩阵快速幂模板题
		
题目分析: 对于给出的n,求出斐波那契数列第n项的最后4为数,当n很大的时候,普通的递推会超时,这里介绍用矩阵快速幂解决当递推次数很大时的结果,这里矩阵已经给出,直接计算即可 #include< ...
 - Luogu 1962 斐波那契数列(矩阵,递推)
		
Luogu 1962 斐波那契数列(矩阵,递推) Description 大家都知道,斐波那契数列是满足如下性质的一个数列: f(1) = 1 f(2) = 1 f(n) = f(n-1) + f(n ...
 
随机推荐
- SpringBoot注解 + 详解
			
可以使用Ctrl + F搜索,也可以右侧目录自行检索 @SpringBootApplication 包含了@ComponentScan.@Configuration和@EnableAutoConfig ...
 - SpringBoot——配置类实现WebMvcConfigurer接口来配置拦截器、view-controller、视图解析器等
			
目的:为了保留SpringBoot对SpringMVC自动配置,另外我们还想要做一些自己拓展的功能 如何做扩展? 以配置view-controller实现跳转为例: 原先在SpringMvc中我们写v ...
 - Linux命令(磁盘的卸载与挂载)
			
一.光盘挂载与卸载: 1.将光盘CD-ROM(hdc)安装到文件系统的/mnt/cdrom目录下的命令是 C . A mount /mnt/cdrom B mount /mnt/cdrom /dev ...
 - 测试MySQL锁的问题
			
测试MySQL锁的问题 目录 测试MySQL锁的问题 1 Record Lock 2 Next-Key Lock 2 死锁测试 InnoDB支持三种行锁: Record Lock:单个行记录上面的锁 ...
 - sql把一个字段中的特定字符替换成其他字符
			
将'0654879'替换成'0754879' UPDATE dbo.SG_Functionality SET FunctionalityCode=REPLACE(FunctionalityCode,' ...
 - iOS-block本质是什么?
			
一: block的原理是怎样的?本质是什么? block本质上也是一个OC对象,因为它的内部也有个isa指针 block是封装了函数调用以及函数调用环境的OC对象 接下来我们将通过底层源码来论证上诉两 ...
 - .NET Core/.NET5/.NET6 开源项目汇总9:客户端跨平台UI框架
			
系列目录 [已更新最新开发文章,点击查看详细] .NET Core 实现了跨平台,支持在 Windwos.Linux.macOS上开发与部署,但是也仅限于Web应用程序.对于Windows桌面 ...
 - 用python+pyqt5语言编写的扫雷小游戏软件
			
github源码地址:https://github.com/richenyunqi/Mine-game ,撒娇打滚求star哦~~ღ( ´・ᴗ・` )比心 扫雷主界面模块 整个扫雷界面使用大量的白色方 ...
 - python返回列表最大值(java返回数组最大值)
			
b=["3","2","1","6","5","2","1" ...
 - 44、djanjo工程(介绍)
			
44.1.什么时web框架: 1.框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用看框架可以 帮助你快速开发特定的形同,简单的说,就是你用别人搭建好的舞台来做 ...