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的编程艺术 ...
随机推荐
- 开启后台 Service 闪退
04-29 15:36:23.395: E/ActivityThread(15275): Performing stop of activity that is not resumed: {com.e ...
- java web开发环境配置
一:安装jdk http://www.java.com/zh_TW/ 二:下载tomcat,这里是zip版.http://tomcat.apache.org/download-70.cgi 三:在 ...
- Linux命令中特殊符号
转自:http://blog.chinaunix.net/uid-16946891-id-5088144.html 在shell中常用的特殊符号罗列如下:# ; ;; . , / \ 'strin ...
- ListView 完全优化 + 多种listitem布局处理
# 百度了下,感觉下面的博客文章还都挺全面的,写的很好,直接分享得了 Android性能优化--Listview优化 - tonycheng93 - 博客园http://www.cnblogs.co ...
- SQL数据字符串的拆分
一.概述: MSSQL字符串的拆分没有封装太多常用的方式,所以如果向数据库中插入用特殊字符分割字符串(比如CB0$CB2$CB3,CB0$CB2$CB3)时就可能需要数据库能够分割字符串,SQL中拆分 ...
- AJax中post与get请求注意事项
在使用ajax提交表单时,一定要区分提交按钮的形式和数据表头的设置,实例如下: GET请求: HTML代码: <!doctype html> <html lang="en& ...
- 蛋疼的Fedora17
在公司给同事要安装ASM oracle 11g,说要在forder17上安装,于是乎我先在自己的虚拟机上安装了一个forder17,遇到了几个很蛋疼的问题: 1. 安装的时候没有创建普通用户 ...
- [LeetCode] Happy Number
Happy Number Total Accepted: 35195 Total Submissions: 106936 Difficulty: Easy Write an algorithm to ...
- CI登录验证
预先加载数据库操作类和Session类 即在autoload.php中,$autoload['libraries'] = array('database', 'session'); a. 注: 使用s ...
- [SQL]oracle 的to_char、to_number、to_date用法
关键字: oracle 的to_char.to_number.to_date用法 TO_CHAR 是把日期或数字转换为字符串TO_DATE 是把字符串转换为数据库中得日期类型转换函数TO_NUMBER ...