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 ...
随机推荐
- wrk(2)- Lua 脚本的使用
背景 要用 wrk 进行压测 看了下其他同事的压测,都用了 Lua 脚本来自定义一些东西 所以这一篇主要讲 Lua 脚本 Lua 介绍 Lua 脚本是一种轻量小巧的脚本语言,用标准 c 语言编写,并以 ...
- 【NX二次开发】查找部件中的对象 UF_OBJ_cycle_objs_in_part
返回所有层上指定类型部件中的所有对象,不管它们的当前显示状态如何.这个例程不返回表达式.指定对象.临时(系统创建的)对象或休眠对象.休眠对象指的是从模型中删除的对象例如,如果你混合了一条边,那么这条边 ...
- 面试官:MySQL的可重复读级别能解决幻读问题吗?
引言 之前在深入了解数据库理论的时候,了解到事务的不同隔离级别可能存在的问题.为了更好的理解所以在MySQL数据库中测试复现这些问题.关于脏读和不可重复读在相应的隔离级别下都很容易的复现了. 但是对于 ...
- Mysql优化(出自官方文档) - 第一篇(SQL优化系列)
Mysql优化(出自官方文档) - 第一篇 目录 Mysql优化(出自官方文档) - 第一篇 1 WHERE Clause Optimization 2 Range Optimization Skip ...
- 【Azure 事件中心】在Service Bus Explorer工具种查看到EventHub数据在分区中的各种属性问题
问题描述 通过Service Bus Explorer工具,查看到Event Hub的属性值,从而产生的问题及讨论: Size in Bytes: 这个是表示当前分区可以存储的最大字节数吗? La ...
- Kubernetes中予许及限制(PodSecurityPolicy)使用宿主机资源
1.在pod中使用宿主机命名空间.端口等资源 pod中的容器通常在分开的Linux命名空间中运行.这些命名空间将容器中的进程与其他容器中,或者宿主机默认命名空间中的进程隔离开来. 例如,每一个pod有 ...
- Redis 雪崩、穿透、击穿、并发、缓存讲解以及解决方案
1.缓存雪崩 数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机. 比如一个雪崩的简单过程 1.redis集群大面积故障 2.缓存 ...
- Nexus3搭建Docker等私服
0.目的 docker私有仓库的搭建,方便后期的CI/CD dotnetcore项目sdk本地缓存,解决微软官方下载缓慢的问题 nuget私有仓库 等 1.环境情况 windows10 Docker ...
- 配置本地yum源以及挂载镜像
配置本地yum源以及挂载镜像(centos7.6) 配置yum源 # cd /etc/yum.repos.d 可以备份或者删除里面的文件 新建文件 # touch /etc/yum.repos.d/l ...
- 怎么用git将自己的源代码提交到git服务器上
在git服务器上新建仓库 在本地初始化本地仓库 初始化 git init 添加远程仓库地址 git remote add origin XXX.git 同步 git pull origin maste ...