BZOJ4471 : 随机数生成器Ⅱ
\[\begin{eqnarray*}
x_i&=&x_{i-1}+x_{i-2}\\
x_i^2&=&x_{i-2}^2+x_{i-1}^2+2x_{i-2}x_{i-1}\\
x_{i-1}x_i&=&x_{i-1}^2+x_{i-2}x_{i-1}
\end{eqnarray*}\]
故可以构造转移矩阵$A$进行递推。
不妨设$n\geq m$,则可以预处理出$A^0,A^1,...,A^n$以及$A^n,A^{2n},...,A^{nn}$。
那么查询某个数的复杂度为$4^2$。
总时间复杂度为$O(4^3n)$。
#include<cstdio>
#include<algorithm>
#include<tr1/unordered_map>
#define rep(i) for(int i=0;i<4;i++)
using namespace std;
using namespace std::tr1;
typedef long long ll;
const int N=4,M=100005;
int n,m,lim,q,P,C1,C2,i,j,x,y,d,r,o;
int B[N],A[M][N][N],pA[M][N][N];
unordered_map<ll,int>T;
inline void read(ll&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void mul(int a[][N],int b[][N],int c[][N]){rep(k)rep(j)if(b[k][j])rep(i)if(a[i][k])c[i][j]=(1LL*a[i][k]*b[k][j]+c[i][j])%P;
}
inline int get(ll t){int x=0,*a=pA[t/lim][3],(*b)[N]=A[t%lim];rep(i){int y=0;rep(j)y=(1LL*a[j]*b[j][i]+y)%P;x=(1LL*y*B[i]+x)%P;}return x;
}
inline int ask(int x,int y){if(x>n||y>m)return P;ll t=1LL*(x-1)*m+y;if(T.find(t)!=T.end())return T[t];return get(t);
}
void write(int x){if(x>=10)write(x/10);putchar(x%10+'0');
}
int main(){rep(i)A[0][i][i]=pA[0][i][i]=1;A[1][0][1]=1;A[1][1][0]=A[1][1][1]=1,A[1][1][2]=2;A[1][2][1]=A[1][2][2]=1;A[1][3][1]=A[1][3][3]=1;scanf("%d%d%d%d%d%d",&n,&m,&q,&P,&C1,&C2);B[0]=B[3]=1LL*C1*C1%P;B[1]=1LL*C2*C2%P;B[2]=1LL*C1*C2%P;lim=n>m?n:m;for(i=2;i<=lim;i++)mul(A[i-1],A[1],A[i]);for(i=1;i<=lim;i++)mul(pA[i-1],A[lim],pA[i]);for(i=1;i<=q;i++){ll x,y;read(x),read(y);if(T.find(x)==T.end())T[x]=get(x);if(T.find(y)==T.end())T[y]=get(y);swap(T[x],T[y]);}for(i=x=y=1,o=ask(1,1);i<n+m-1;i++){write(o),putchar(' ');d=ask(x+1,y),r=ask(x,y+1);if(d<=r)x++,o=d;else y++,o=r;}return write(o),0;
}
转载于:https://www.cnblogs.com/clrs97/p/5352447.html
BZOJ4471 : 随机数生成器Ⅱ相关推荐
- luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 发个水题的 题解证明我还在() luogu P3306 [SDOI2013] 随机数生成器 Webli ...
- Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom
Java中的随机数生成器:Random,ThreadLocalRandom,SecureRandom 文中的 Random即:java.util.Random, ThreadLocalRandom 即 ...
- 开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
原文:[原创]开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器 本博客所有文章分类的总目录:http://www.cnblogs.com/asxiny ...
- P5147 随机数生成器 [数列]
P5147 随机数生成器 数学老师看不懂系列 看题目这一片代码就很晕: int work(int x) {if(x==1)return 0;else return work(rand(1,x))+1; ...
- UA STAT675 统计计算I 随机数生成1 随机数生成器的一般理论
UA STAT675 统计计算I 随机数生成1 随机数生成器的一般理论 RNG的抽象表示 RNG的质量指标 RNG的统计检测 在统计计算中,从某个分布中进行采样通常分为两个步骤: 生成随机数z1,z2 ...
- boost::sort模块实现提供多种分布的灵活随机数生成器的测试程序
boost::sort模块实现提供多种分布的灵活随机数生成器的测试程序 实现功能 C++实现代码 实现功能 boost::sort模块实现提供多种分布的灵活随机数生成器的测试程序 C++实现代码 #i ...
- boost::sort模块实现支持不同分布的随机数生成器的测试程序
boost::sort模块实现支持不同分布的随机数生成器的测试程序 实现功能 C++实现代码 实现功能 boost::sort模块实现支持不同分布的随机数生成器的测试程序 C++实现代码 #inclu ...
- ITK:Mersenne Twister随机数生成器
ITK:Mersenne Twister随机数生成器 内容提要 C++实现代码 内容提要 产生一个随机数 C++实现代码 #include "itkMersenneTwisterRandom ...
- bzoj3122 [SDOI2013]随机数生成器
bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...
最新文章
- win10html中文乱码,Win10预览版10125中文语言包安装及乱码解决方法
- quartz (一) 基于 Quartz 开发企业级任务调度应用
- 5.1.2全景声音箱摆位_如何体验全景声
- SpringBoot笔记整理(四)
- python3 try except or_Python基础10:try except异常处理详解
- Linux学习笔记---修改CPU频率为自动调节模式
- 十大经典算法_家庭用电预测:线性回归算法(时间与功率功率与电流之间的关系)
- pyqt 子窗口控制主窗口绘图_PyQtGraph如何关闭绘图窗口/关闭所有绘图窗口?
- 利用MATLAB编写高斯积分
- 医疗服务机器人市场复合年增长率将达15.7%
- 计算机控制技术期中测试素材2020版
- 解决 uniapp 打包次数限制
- Markdown记录
- java中的异或交换位置_java异或实现两个变量交换
- 读书笔记:自动控制原理
- Antv踩坑—导入画布数据监听画布渲染完成事件
- CSS组件_0 燕尾
- DiskPart 常用操作【Windows】
- 浏览器在线查看pdf文件 pdf.js的使用教程
- 对冲基金表现大盘点(一):DE Shaw
热门文章
- Python入门--特殊属性,特殊方法__new__,__init__
- JQueryDOM之查找节点
- java编译异常和运行时异常_浅谈异常结构图、编译期异常和运行期异常的区别...
- 单通道图像保存_3D图像展示篇结构更清晰
- 找出不是两个数组共有的元素_06.数组(练习篇)
- [leetcode]529. 扫雷游戏 DFS递归、BFS、DFS栈实现
- Unity3D之NGUI基础6.1:按钮交互
- bzoj 1667: [Usaco2006 Oct]Cows on Skates滑旱冰的奶牛(BFS)
- 猜年龄 蓝桥 填空题2013省赛
- python实现自动提取句子中的关键字