题面

题解

线性常系数齐次递推sb板子题

$a_n=233a_{n-1}+666a_{n-2}$的特征方程为

$$ x^2=233x+666 \\ x^2-233x+666=0 \\ x_1=\frac{233+\sqrt{56953}}2,x_2=\frac{233-\sqrt{56953}}2 \\ \therefore a_n=\alpha x_1^n+\beta x_2^n \\ \because a_0=0,a_1=1 \\ \therefore \begin{cases} \alpha+\beta=0 \\ \alpha x_1+\beta x_2=1 \end{cases} \\ \therefore \begin{cases} \alpha=\frac1{\sqrt{56953}} \\ \beta=-\frac1{\sqrt{56953}} \end{cases} \\ \therefore a_n=\frac1{\sqrt{56953}}\left(\left(\frac{233+\sqrt{56953}}2\right)^n-\left(\frac{233-\sqrt{56953}}2\right)^n\right) \\ \because 188305837^2 \equiv 56953 \; (\text{mod}\;10^9+7) \\ \therefore a_n \equiv 233230706 \times\left(94153035^n-905847205^n\right) $$

求里面两个底数的$n$次方如何$O(1)$求?分段打表

设$f_1(n)=x^{65536n},f_2(n)=x^n$

则:

$$ x^n=f_1(n/65536)\times f_2(n\%65536) $$

就可以了。

复杂度$\text{O}(T)$,$T$是询问次数

代码

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define RG register namespace Maker
{
unsigned long long SA, SB, SC;
void init() { scanf("%llu%llu%llu", &SA, &SB, &SC); }
inline 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;
}
} const int Mod(1e9 + 7), alpha(233230706), x_1(94153035),
x_2(905847205), x_3(64353223), x_4(847809841);
const int maxn(65536 + 5);
int f_1[maxn], f_2[maxn], f_3[maxn], f_4[maxn], T, ans; inline int Pow_1(int x) { return 1ll * f_3[x >> 16] * f_1[x & 65535] % Mod; }
inline int Pow_2(int x) { return 1ll * f_4[x >> 16] * f_2[x & 65535] % Mod; } int main()
{
f_1[0] = f_2[0] = f_3[0] = f_4[0] = 1;
for(RG int i = 1; i < 65536; i++) f_1[i] = 1ll * f_1[i - 1] * x_1 % Mod;
for(RG int i = 1; i < 65536; i++) f_2[i] = 1ll * f_2[i - 1] * x_2 % Mod;
for(RG int i = 1; i < 65536; i++) f_3[i] = 1ll * f_3[i - 1] * x_3 % Mod;
for(RG int i = 1; i < 65536; i++) f_4[i] = 1ll * f_4[i - 1] * x_4 % Mod;
scanf("%d", &T); Maker::init(); unsigned long long n;
while(T--) n = Maker::rand() % (Mod - 1),
ans ^= 1ll * alpha * (Pow_1(n) - Pow_2(n) + Mod) % Mod;
printf("%d\n", ans);
return 0;
}

Luogu5110 块速递推的更多相关文章

  1. P5110 块速递推-光速幂、斐波那契数列通项

    P5110 块速递推 题意 多次询问,求数列 \[a_i=\begin{cases}233a_{i-1}+666a_{i-2} & i>1\\ 0 & i=0\\ 1 & ...

  2. 洛谷 P5110 块速递推

    题目大意: 给定一个数列a满足递推式 \(An=233*an-1+666*an-2,a0=0,a1=1\) 求这个数列第n项模\(10^9+7\)的值,一共有T组询问 \(T<=10^7\) \ ...

  3. P5110 【块速递推】

    太菜了,不会生成函数,于是用特征方程来写的这道题 首先我们知道,形如\(a_n=A*a_{n-1}+B*a_{n-2}\)的特征方程为\(x^2=A*x+B\) 于是此题的递推式就是:\(x^2=23 ...

  4. 【洛谷 P5110】 块速递推(矩阵加速,分块打表)

    题目链接 掌握了分块打表法了.原来以前一直想错了... 块的大小\(size=\sqrt n\),每隔\(size\)个数打一个表,还要在\(0\text{~}size-1\)每个数打一个表. 然后就 ...

  5. 洛谷P5110 块速递推 [分块]

    传送门 思路 显然可以特征根方程搞一波(生成函数太累),得到结果: \[ a_n=\frac 1 {13\sqrt{337}} [(\frac{233+13\sqrt{337}}{2})^n-(\fr ...

  6. P5110 块速递推

    传送门 为啥我就没看出来有循环节呢-- 打表可得,这个数列是有循环节的,循环节为\(10^9+6\),然后分块预处理,即取\(k=sqrt(10^9+6)\),然后分别预处理出转移矩阵\(A\)的\( ...

  7. P5110-块速递推【特征方程,分块】

    正题 题目链接:https://www.luogu.com.cn/problem/P5110 题目大意 数列\(a\)满足 \[a_n=233a_{n-1}+666a_{n-2},a_0=0,a_1= ...

  8. 【BZOJ-2476】战场的数目 矩阵乘法 + 递推

    2476: 战场的数目 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 58  Solved: 38[Submit][Status][Discuss] D ...

  9. Visual Studio 2015 速递(4)——高级特性之移动开发

    系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...

随机推荐

  1. C++ 入门随手笔记及联系

    一.第一个C++程序 1.文件扩展名  C++源代码的文件扩展名.cpp.C.cxx.c(需要指定编译语言)  自定义的头文件依然保留.h 2.头文件  C++标准库的头文件不带.h,最常用的是ios ...

  2. 有序字典(OrderedDict)、默认字典(defaultdict)内置函数

    http://www.cnblogs.com/wupeiqi/articles/5115190.html import collections do = collections.OrderedDict ...

  3. python 使用exchange发送邮件(三)

    FYI: https://blog.csdn.net/LeoForBest/article/details/79429955

  4. windows 10最新版镜像资源下载 Win10 ISO下载教程

    最近发现原创写的文章被无良爬走,而且变成了无图尬文,所以开头附上原文地址: http://www.cnblogs.com/xueyudlut/p/7497975.html -------------- ...

  5. C++ Boost在Windows和Linux下的编译安装

    再debian下直接apt-get install gcc g++就可以了.按照类似的逻辑,再Fedora下yum install gcc g++ 报告无法找到g++包. 差了一下,原来这个包的名字叫 ...

  6. C++使用初始化列表提高效率(转):

    转自:http://www.cnblogs.com/graphics/archive/2010/07/04/1770900.html 何谓初始化列表 与其他函数不同,构造函数除了有名字,参数列表和函数 ...

  7. 64位操作系统下调用32位com的问题

    Hello Guys! I am trying to create a simple VBS script to automatically open some .tif images from a ...

  8. PHP设计模式系列 - 装饰器

    什么是装饰器 装饰器模式,对已有对象的部分内容或者功能进行调整,但是不需要修改原始对象结构,可以使用装饰器设 应用场景 设计一个UserInfo类,里面有UserInfo数组,用于存储用户名信息 通过 ...

  9. oracle删除用户及其表空间

    oracle删除用户及其表空间 删除表空间:可以先将其offlinealter tablespace xx offline;将磁盘上的数据文件一同删除drop tablespace xxx inclu ...

  10. Ingress 暴露tcp端口

    有一部分应用 需要暴露tcp端口,查看官方文档 https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/expo ...