P5110-块速递推【特征方程,分块】
正题
题目链接:https://www.luogu.com.cn/problem/P5110
题目大意
数列\(a\)满足
\]
\(T\)组询问给出\(n\)求\(a_n\)
\(1\leq T\leq 5\times 10^7\),\(n\)在\(\text{unsigned long long}\)范围内
解题思路
上面那个递推式的特征方程就是\(x^2-233x-666\),直接带式子解出来\(x_0=\frac{233+\sqrt{56953}}{2},x_1=\frac{233-\sqrt{56953}}{2}\)。
然后设\(a_n=c_0x_0^n+c_1x_1^n\),那么带入\(a_0\)和\(a_1\)就有
\]
解出来有\(c_0=\frac{1}{\sqrt{56953}},c_1=-\frac{1}{\sqrt{56953}}\)。
这样我们就可以\(O(T\log n)\)求答案了,但是还是不够。
先根据欧拉定理让\(n\)模上\(\varphi(P)\)缩小范围
然后分块处理快速幂,处理出\(x^i\)和\(x^{i\sqrt P}(i\in[0,\sqrt P])\),这个是\(O(\sqrt P)\)的,然后每次把\(n\)分为整块的成上末尾的就好了。
时间复杂度\(O(\sqrt P+T)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const ll P=1e9+7,Phi=P-1;
const ll sq=188305837,T=32000;
ll Q,n,p0[T+1],p1[T+1],P0[T+1],P1[T+1],ans;
ll pw0(ll x){return P0[x/T]*p0[x%T]%P;}
ll pw1(ll x){return P1[x/T]*p1[x%T]%P;}
namespace Mker
{
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%Phi;
}
}
signed main()
{
ll inv2=(P+1)/2;
ll x0=(233+sq)*inv2%P,x1=(P+233-sq)*inv2%P;
p0[0]=p1[0]=P0[0]=P1[0]=1;
for(ll i=1;i<=T;i++)
p0[i]=p0[i-1]*x0%P,p1[i]=p1[i-1]*x1%P;
for(ll i=1;i<=T;i++)
P0[i]=P0[i-1]*p0[T]%P,P1[i]=P1[i-1]*p1[T]%P;
ll inv=233230706,c0=inv,c1=P-inv;
scanf("%lld",&Q);Mker::init();
while(Q--){
n=Mker::rand();
// scanf("%lld",&n);ans=0;
ans^=(c0*pw0(n)+c1*pw1(n))%P;
// printf("%lld\n",ans);
}
printf("%lld\n",ans);
}
P5110-块速递推【特征方程,分块】的更多相关文章
- P5110 块速递推-光速幂、斐波那契数列通项
P5110 块速递推 题意 多次询问,求数列 \[a_i=\begin{cases}233a_{i-1}+666a_{i-2} & i>1\\ 0 & i=0\\ 1 & ...
- 洛谷 P5110 块速递推
题目大意: 给定一个数列a满足递推式 \(An=233*an-1+666*an-2,a0=0,a1=1\) 求这个数列第n项模\(10^9+7\)的值,一共有T组询问 \(T<=10^7\) \ ...
- 洛谷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\)的\( ...
- P5110 【块速递推】
太菜了,不会生成函数,于是用特征方程来写的这道题 首先我们知道,形如\(a_n=A*a_{n-1}+B*a_{n-2}\)的特征方程为\(x^2=A*x+B\) 于是此题的递推式就是:\(x^2=23 ...
- Luogu5110 块速递推
题面 题解 线性常系数齐次递推sb板子题 $a_n=233a_{n-1}+666a_{n-2}$的特征方程为 $$ x^2=233x+666 \\ x^2-233x+666=0 \\ x_1=\fra ...
- 【洛谷 P5110】 块速递推(矩阵加速,分块打表)
题目链接 掌握了分块打表法了.原来以前一直想错了... 块的大小\(size=\sqrt n\),每隔\(size\)个数打一个表,还要在\(0\text{~}size-1\)每个数打一个表. 然后就 ...
- 【第53套模拟题】【递推】【RMQ】【二进制】【分块】
题目:(开始自己描述题目了...) 第一题大意: 求1~n的所有排列中逆序对为k个的方案数,输出方案数%10000,n<=1000. 解:这道题一个递推,因为我基本上没怎么自己做过递推,所以推了 ...
- 【BZOJ-2476】战场的数目 矩阵乘法 + 递推
2476: 战场的数目 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 58 Solved: 38[Submit][Status][Discuss] D ...
随机推荐
- 使用dom4j工具:获取xml中的标签属性(三)
package dom4j_read; import java.io.File; import java.util.List; import org.dom4j.Attribute; import o ...
- io中的特殊流Properties
对于去年学习IO的时候一些代码贴上来: 初识properties,因为继承自hashtable,其中可以使用put操作: package special; import java.util.Prope ...
- Java程序设计学习笔记(三)—— IO
时间:2016-3-24 11:02 --IO流(Input/Output) IO流用来处理设备之间的数据传输. Java对数据的操作是通过流的方式. Java对于操作流的对象都在 ...
- 《深入理解java虚拟机》第3版笔记3
第3章 垃圾收集器与内存分配策略 可达性分析算法 在Java技术体系里面,固定可作为GC Roots的对象包括以下几种: 在虚拟机栈(栈帧中的本地变量表)中引用的对象,譬如各个线程被调用的方法堆栈中使 ...
- Spring Data JPA:解析CriteriaQuery
CriteriaQuery 源码定义 CriteriaQuery定义在包路径javax.persistence.criteria下,其定义如下: /** * The <code>Crite ...
- WSL(Ubuntu)下安装Redis
一.安装 输入命令安装redis-server sudo apt-get install redis-server 安装完成后打开redis.conf文件,找到bind 127.0.0.1,更改为bi ...
- openresty(nginx) 配置 http与https使用同一个端口,禁止 IP 直接访问
准备好工作目录 mkdir work cd work mkdir conf logs 准备好 conf/nginx.conf 配置文件, 把 your.domain 换成你自己的域名 user abc ...
- 性能测试工具JMeter 基础(一)—— 安装、配置环境变量
JMeter下载 下载地址:https://jmeter.apache.org/download_jmeter.cgi 下载完成后解压后可直接使用,不用进行安装 环境变量配置 新增变量名:JMETER ...
- ubantu硬盘不足,无法启动
我的ubantu虚拟机经过我一顿操作后,就起不来了.然后经过多方询问,广集天下良方,最终发现是由于分配的硬件空间不足导致的.现象如下: 通过查看 root@ubantu:/snap# df -h Fi ...
- openswan中的in_struct和out_struct函数
openswan中的in_struct和out_struct函数 文章目录 openswan中的in_struct和out_struct函数 1. 花絮 2. in_struct代码实现分析 3. 它 ...