【洛谷 P5110】 块速递推(矩阵加速,分块打表)
题目链接
掌握了分块打表法了。原来以前一直想错了。。。
块的大小\(size=\sqrt n\),每隔\(size\)个数打一个表,还要在\(0\text{~}size-1\)每个数打一个表。
然后就可以做到\(O(1)\)查询了。
比如要求\(A^{n}\),只需要算出\(biao[n/size]*pow[n\mod size]\)就好了。
然后我是看题解用了通项公式。。事实上套个矩阵也没有影响。
#include <cstdio>
#include <cmath>
#define ll unsigned long long
#define MOD 1000000007
namespace Mker{
ll SA,SB,SC;
void init(){scanf("%llu%llu%llu",&SA,&SB,&SC);}
ll rand(){
SA^=SA<<32,SA^=SA>>13,SA^=SA<<1;
ll t=SA;
SA=SB,SB=SC,SC^=t^SA;return SC;
}
}
int T, ans, tmp, a[1000010], b[1000010], c[1000010], d[1000010], e, size;
int n;
inline int f_pa(int k){
return (long long)a[k / size] * c[k % size] % MOD;
}
inline int f_pb(int k){
return (long long)b[k / size] * d[k % size] % MOD;
}
inline void make_a(int n, int k){
tmp = 1;
while(k){
if(k & 1) tmp = (long long)tmp * n % MOD;
n = (long long)n * n % MOD;
k >>= 1;
}
a[e] = tmp;
}
inline void make_b(int n, int k){
tmp = 1;
while(k){
if(k & 1) tmp = (long long)tmp * n % MOD;
n = (long long)n * n % MOD;
k >>= 1;
}
b[e] = tmp;
}
int main(){
size = sqrt(1000000006); c[0] = d[0] = 1;
for(int i = 0; i <= 1000000006; i += size, ++e)
make_a(94153035, i), make_b(905847205, i);
for(int i = 1; i < size; ++i) c[i] = (long long)c[i - 1] * 94153035 % MOD;
for(int i = 1; i < size; ++i) d[i] = (long long)d[i - 1] * 905847205 % MOD;
scanf("%d", &T);
Mker::init();
while(T--){
n = Mker::rand() % 1000000006;
ans ^= (233230706ll * (f_pa(n) - f_pb(n)) % MOD + MOD) % MOD;
}
printf("%d\n", ans);
return 0;
}
【洛谷 P5110】 块速递推(矩阵加速,分块打表)的更多相关文章
- 洛谷 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 块速递推-光速幂、斐波那契数列通项
P5110 块速递推 题意 多次询问,求数列 \[a_i=\begin{cases}233a_{i-1}+666a_{i-2} & i>1\\ 0 & i=0\\ 1 & ...
- 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 ...
- 洛谷P1240-诸侯安置+递推非搜索
诸侯安置 这道题是一题递推题,一开始自己不知道,用了搜索,只过了三个样例: 两两相同的合并, 成 1,1,3,3,5,5........n*2-1; 然后我们会容易发现一种不同与搜索的动态规划做法. ...
- P5110-块速递推【特征方程,分块】
正题 题目链接:https://www.luogu.com.cn/problem/P5110 题目大意 数列\(a\)满足 \[a_n=233a_{n-1}+666a_{n-2},a_0=0,a_1= ...
- 洛谷P2151 [SDOI2009] HH去散步 [矩阵加速]
题目传送门 HH去散步 题目描述 HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走 ...
随机推荐
- Qt-排序
1.要求传入起始指针,总长度,单元素空间占用大小(sizeof(A[i])),判断函数. 判断函数参数类型为const void *,使用需要在函数内自行转换为对应类型, 返回值为整数型,升序排序时正 ...
- 原生js实现自定义alert风格和实现
2018年6月29 最新更新 添加函数节流,解决多次点击问题,添加单例模式,提高代码性能. <!DOCTYPE html> <html lang="en"> ...
- struts如何在Action类中操作request,session
在servlet中,通过request.getparameter与setparameter来实现后端与前端jsp页面的数据交互,那么在struts中,也有几种方式来操作request,session实 ...
- vs中编译连接时的警告屏蔽
编译警告类型为warning C4996的形式 可以采用的#pragma warning(disable:4996)屏蔽掉这种编译警告 连接警告类型为warning LNK4049的形式 这是由于不同 ...
- BZOJ 2306 幸福路径(DP)
题解来源:http://www.cnblogs.com/jianglangcaijin/p/3799494.html 最后必然是走了一条链,或者是一个环(一直绕),或者是一条链加一个环.设f[i][j ...
- CentOS httpd服务(Apache)
1.从ISO镜像安装,Apache 服务的软件包名称为 httpd #检查源配置[root@localhost media]# cat /etc/yum.repos.d/CentOS-Media.re ...
- 【刷题】BZOJ 1003 [ZJOI2006]物流运输
Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...
- bzoj1208: [HNOI2004]宠物收养所 (sbt)
切傻逼题还能wa那么多次我也是醉了 好啦其实是sbt都不会敲了(一直用神器treap) 重点是研究了下陈大神的删除,以前treap的删除都是直接旋转去删的…… 还是treap大法好&…… 题解 ...
- POJ2195:Going Home——题解
http://poj.org/problem?id=2195 题目大意: 有些人和房子,一个人只能进一个房子,人走到房子的路程即为代价. 求所有人走到房子后的最小代价. ——————————————— ...
- HDU3949:XOR——题解
http://acm.hdu.edu.cn/showproblem.php?pid=3949 求n个数的异或和第k小. 参考:https://blog.sengxian.com/algorithms/ ...