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;
}
BZOJ4471 : 随机数生成器Ⅱ的更多相关文章
- 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
- 【BZOJ-3122】随机数生成器 BSGS
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1362 Solved: 531[Submit][Sta ...
- BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘
题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...
- [BZOJ3671][UOJ#6][NOI2014]随机数生成器
[BZOJ3671][UOJ#6][NOI2014]随机数生成器 试题描述 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来 ...
- NOI2014 随机数生成器
随机数生成器 [问题描述] 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来获得随机性.事实上,随机数生成函数也并不是真正的 ...
- 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)
3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1442 Solved: 552 Description ...
- Linux下对拍脚本与随机数生成器
对拍脚本 新建一个文档 check.sh 作为对拍脚本. #!/bin/bash while(true)do #死循环 ./data > .in #运行数据生成器,将数据输出到1.in ./st ...
- 矩阵(快速幂):COGS 963. [NOI2012] 随机数生成器
963. [NOI2012] 随机数生成器 ★★ 输入文件:randoma.in 输出文件:randoma.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 栋 ...
- 解密随机数生成器(二)——从java源码看线性同余算法
Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...
随机推荐
- 解决osg路径与文件名中的中文字符问题
转至:http://blog.csdn.net/zhuqinglu/article/details/2064013 在打开或者保存一个osg模型的时候,经常遇到中文路径或者中文文件名的问题,此时会提示 ...
- JavaScript基础——使用数组
Array对象提供存储和处理一组其他对象的一种手段.数组可以存储数值.字符串或其他JavaScript对象.创建JavaScript数组有几种不同的方法.例如,下面的语句穿件同样的驻足的3个相同的版本 ...
- 查看进程,按内存从大到小 ,查看进程,按CPU利用率从大到小排序
查看进程,按内存从大到小 ps -e -o "%C : %p : %z : %a"|sort -k5 -nr 查看进程,按CPU利用率从大到小排序 ps -e -o "% ...
- jQuery – 3.JQuery的Dom操作
3.1 JQuery的Dom操作 1.使用html()方法读取或者设置元素的innerHTML 2.使用text()方法读取或者设置元素的innerText 3.使用attr() ...
- 【转】JQuery插件ajaxFileUpload 异步上传文件(PHP版)
前几天想在手机端做个异步上传图片的功能,平时用的比较多的JQuery图片上传插件是Uploadify这个插件,效果很不错,但是由于手机不支持flash,所以不得不再找一个文件上传插件来用了.后来发现a ...
- sqlplus使用(二)
详见SQL*Plus® User's Guide and Reference Release 11.2 5 Using Scripts in SQL*Plus 1.定义环境变量 _EDITOR ...
- phpcms 完美实现 导航栏当前栏目高亮
我们在用phpcms做网站的时候,经常碰到导航栏高亮功能,或者侧栏高亮,这个会涉及到几个问题: .栏目列表页子栏目高亮判断,如果当前页面为子栏目,他的顶级栏目如果在导航栏也要高亮. .内容页高亮,这个 ...
- poj 3895(求无向图的最大简单环)
题目链接:http://poj.org/problem?id=3895 思想很简单,就是dfs,并且用一个数组记录到该节点所走过的长度,然后如果遇到已经走过的,就说明存在环了, 更新一下ans. /* ...
- 用js实现图片自动加载的瀑布流效果
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Java学习笔记(十)——多态
一.多态 1.对象的多种形态 (1)引用多态: 父类的引用可以指向本类的对象 父类的引用可以指向子类的对象 (2)方法多态: 创建本类对象时,调用的方法为本类方法: 创建子类对象时,调用的方法是子类方 ...